1

アプリケーションの制御フローにbluebirdを使用しています。promisifyを実装して再帰関数をプロミスに拡張しようとしていますが、「then」メソッドが実行されなかったようです

ある JSON オブジェクトから別の JSON オブジェクトへのマッピングを行っています。find 関数は JSON プロパティを再帰的に調べ、特定の条件に基づいてプロパティを返します。

var promise = require("bluebird");
var mapToModel = function(res){
  // res is a json structure
  var processes = res.definitions.process;
  var diagrams = res.definitions.BPMNDiagram; 
  var documents = [];
  for(var prop in processes) {
    if(processes.hasOwnProperty(prop)){
      var propertyNames = Object.getOwnPropertyNames(processes[prop]);
      for(var property in processes[prop]){
        var mapping ={};
        if(property==="$"){
          //do something with the process
        }else{
        //shapes
          mapping.hash = hash.hashCode(new Date().toString());
          mapping.type = property;
          mapping.value = processes[prop][property];
            var bpmnItem = findPromise(processes[prop][property], function(x) {return x.$.id;}).then(function(value){
              //I'm not reaching this point
              var bpmnId = value.$.id;
              console.log(value);
              if(bpmnId!=undefined){
                console.log("return:"+ bpmnId);
              }  
          });

          documents.push(mapping);
        }
      }
    }
     return documents;
  }
}

var findPromise = promise.promisify(find);
function find(items,f) {
    for(var key in items) { 
        var elem = items[key]; 
        if (f(elem)) { return elem;}
        if(typeof elem === "object") { 
            find(elem,f); // call recursively
        }
    }
}
4

1 に答える 1

2

Bluebird の promisify メソッドは、NodeJS で受け入れられているコールバック規則 (ノードバック) で機能します。

ノードバックは特定の形式ですsomeOp(function(err,result){。最初の引数は常にエラーです。

実際、あなたのfindメソッドは非同期でさえないので、そもそもそれを約束する理由はありません。そのまま呼び出すことができます。

一般に、同期関数を約束するべきではありません。普通に呼び出すだけです。実際、あなたのコードには非同期操作が含まれていないようです。そのため、promise をまったく使用しないでください。

あなたは簡単に行うことができます:

mapping.value = processes[prop][property];
var value = find(processes[prop][property], function(x) {return x.$.id;});
var bpmnId = value.$.id;
console.log(value);
if(bpmnId!=undefined){
    console.log("return:"+ bpmnId);
}  

Promise は、最終的な結果に対する抽象化であることを忘れないでください。以前と同じように、すべてを同期的に実行し続けます。

于 2014-05-12T15:01:55.207 に答える