如何在返回数据之前等待所有承诺得到解决?

时间:2015-05-14 16:00:53

标签: javascript asynchronous promise

有3个功能,第一个是我的承诺。

    fnGetIps : function () {
      return new Promise(function(resolve, reject) {
          var err = [], path = getBaseUrl();
          restGet(path + NAMES, function (res, edges) {
          if (res === undefined) {
              reject("Unable to get data");
          } else {
              resolve(edges);
        }
     });
   });
 },

第二个是我使用我的诺言。

fnGetData: function(obj){
 var promise_holder;
 for (property in obj) {
 if (obj.hasOwnProperty(property)) {
   if(condition){
    promise_holder = fngetip(); 
     }
if(condition2){
     //some other code
     }
   }
 }
 promise_holder.then(function (ifChildren) {
                  obj.children = ifChildren;
                }, function (err) {
                    console.error(err);
                });
              }

最后是一个我调用fnGetData

的函数
 TopoTree : function(children) {
 var treeArray;
 for (i = 0; i < children[i]; i++) {
         fnGetData(children[i]);
          }

                      treeArray.push(treeData);
                      return treeArray;
                  },

我不想在TreeArray的所有承诺得到解决之前返回fnGetData

如何等待所有承诺先解决,然后返回数据?

我无法使用promise.All,因为我在promise_holder范围内没有topotree,或者我在错误的方向思考?

1 个答案:

答案 0 :(得分:2)

你想要Promise.all()

fnGetData返回promise_holder并让TopoTree将它们收集到一个数组中,然后将完成逻辑放在Promise.all()之后的then函数中

fnGetData: function(obj){
  var promise_holder;
  for (property in obj) {
    if (obj.hasOwnProperty(property)) {
      if(condition){
        promise_holder = fngetip(); 
      }
      if(condition2){
        //some other code
      }
    }
  }

  // RETURN THE PROMISE HERE!
  return promise_holder.then(function (ifChildren) {
    obj.children = ifChildren;
    // Return a value for use later:
    return ifChildren;
  });
}   

TopoTree : function(children) {
  var promises = [];
  for (i = 0; i < children.length; i++) {
    promises.push(fnGetData(children[i]));
  }

  // We are handling the result / rejections here so no need to return the
  // promise.
  Promise.all(promises)
    .then(function(treeArray) {
      // Do something with treeArray
    })
    .catch(function(error) {
      console.log(error);
    });
},