Json Promisify node.js中的递归函数
我在应用程序中使用的是控制流,我试图实现promisify以将递归函数扩展为承诺,但似乎“then”方法从未执行过 我正在做一个从一个JSON对象到另一个JSON对象的映射,find函数递归地查看JSON属性,并根据特定条件返回属性Json Promisify node.js中的递归函数,json,node.js,recursion,promise,bluebird,Json,Node.js,Recursion,Promise,Bluebird,我在应用程序中使用的是控制流,我试图实现promisify以将递归函数扩展为承诺,但似乎“then”方法从未执行过 我正在做一个从一个JSON对象到另一个JSON对象的映射,find函数递归地查看JSON属性,并根据特定条件返回属性 var promise = require("bluebird"); var mapToModel = function(res){ // res is a json structure var processes = res.definitions.pro
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-NodeBack的公认回调约定 Nodeback的具体格式为
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);
}
请记住,承诺是对最终结果的抽象。您可以像以前一样同步执行所有操作。这是我的第一个选择,只是使用函数设置值,对于小“查找”来说效果很好但是当我尝试更复杂的操作时,我注意到在流控制中没有等待函数的执行,这就是我决定尝试实现的原因promises@Pedro没有等待函数的执行?JavaScript(除非您明确要求)没有先发制人多任务的概念,简单地说——所有代码都运行到完成。如果你的代码没有运行到完成——这意味着你做了一些异步的事情。如果你做了——请创建一个独立的例子(最好是在新问题中)。否则,您的代码可能会引发异常。通常,您不应该承诺不使用回调的API。感谢您的帮助,我已经用我前面描述的另一个场景创建了另一个问题。如果您有任何帮助,我们将不胜感激