Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json Promisify node.js中的递归函数_Json_Node.js_Recursion_Promise_Bluebird - Fatal编程技术网

Json Promisify node.js中的递归函数

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

我在应用程序中使用的是控制流,我试图实现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
        }
    }
}

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。感谢您的帮助,我已经用我前面描述的另一个场景创建了另一个问题。如果您有任何帮助,我们将不胜感激