在node.js中提交一个recursion函数

我在我的应用程序中使用蓝鸟的控制stream,我试图实现promisify扩展我的recursion函数到一个承诺,但它似乎像“then”方法从来没有得到执行

我正在做一个从一个JSON对象到另一个的映射,find函数按recursion方式查看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 } } } 

Bluebird Promisify方法适用于NodeJS接受的callback约定 – nodeback。

nodebacks是someOp的特定格式someOp(function(err,result){即 – 第一个参数总是出错。

事实上,你的find方法甚至不是asynchronous的,所以没有理由让它开始。 你可以直接调用它。

一般来说,你不应该promisify同步function ,你只需要调用它们。 事实上,你的代码中似乎没有任何asynchronous操作 – 所以你不应该在其中使用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); } 

请记住,承诺是对最终结果的抽象。 和以前一样,你一直在做同步的事情。