我正在使用蓝鸟在我的应用程序中的控制流,我试图实现 promise 扩展我的递归函数到一个承诺,但似乎"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
}
}
}
Bluebird promise方法适用于NodeJS - nodebacks的可接受回调约定。
节点是someOp(function(err,result){
的特定格式,即-第一个参数总是错误。
事实上,您的find
方法甚至不是异步的,因此没有理由一开始就承诺它。你可以简单地称呼它。
一般来说,您不应该承诺同步函数,您只需正常调用它们。实际上,您的代码中似乎没有任何异步操作-因此您根本不应该在其中使用承诺。
你可以简单地做:
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);
}
记住,承诺是对最终结果的抽象。