【问题标题】:How to wait for all promises to be resolved before returning data?如何在返回数据之前等待所有的承诺都解决?
【发布时间】:2015-05-15 00:17:22
【问题描述】:

这里有 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;
                  },

fnGetData 的所有承诺都解决之前,我不想返回TreeArray

如何等待所有的promise先被resolve然后返回数据?

我不能使用promise.All,因为我在topotree 范围内没有promise_holder,还是我想错了方向?

【问题讨论】:

标签: javascript asynchronous promise


【解决方案1】:

你想要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);
    });
},

【讨论】:

  • 它说然后未定义 Promise.all
  • 这个错误准确地说是“TypeError: Cannot call method 'then' of undefined”
  • .all() 返回一个在所有可迭代的 Promise 都已解决时解决的 Promise,因此您应该能够 .then() 它。您是否在使用任何特定的 Promise 库?
  • @mugheesilyas 根据 MDN 上的 ES6 规范页面:“...返回一个承诺...”。因此,唯一可能导致未定义的方法是,如果您 使用 ES6 Promise,而是使用一些明显损坏的 Promise 库。也许您应该将Bluebird 作为更好的选择。它表现得非常好,并且兼容 ES6 实现。
  • @mugheesilyas 验证 promise_holder 实际上是一个承诺,也许你的错误来自那里而不是 Promise.all
猜你喜欢
  • 1970-01-01
  • 2018-09-29
  • 2022-01-17
  • 2014-03-12
  • 2017-11-23
  • 2015-12-07
  • 2018-06-16
  • 2018-12-14
相关资源
最近更新 更多