在node.js中实现递归函数的Promisify

时间:2014-05-12 14:56:48

标签: json node.js recursion promise bluebird

我在我的应用程序中使用bluebird作为控制流程,我试图实现 promisify 将我的递归函数扩展为一个承诺,但似乎喜欢"然后"方法永远不会被执行

我正在从一个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
        }
    }
}

1 个答案:

答案 0 :(得分:2)

Bluebird promisify方法适用于NodeJS的接受回调约定 - nodebacks。

Nodeback的格式为someOp(function(err,result){,即第一个参数始终是错误。

事实上,您的find方法甚至不是异步的,所以没有理由先开始宣传它。您可以直接调用它。

一般情况下,您不应该宣传同步功能,您只需正常调用它们即可。实际上,您的代码中似乎没有任何异步操作 - 因此您根本不应该使用promises。

您可以这样做:

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是对最终结果的抽象。你就像以前一样继续做所有的同步。