【问题标题】:Wait for promises inside of a angular.forEach loop在 angular.forEach 循环中等待承诺
【发布时间】:2016-04-13 21:13:51
【问题描述】:

我知道这个问题已经被问过很多次了,但是经过一天的搜索后,我仍然无法使用它,尽管它就像到处显示的解决方案一样......

我有一个对返回数据数组的数据库的异步请求。对于这个数组中的每个对象,我需要启动另一个对数据库的异步请求,一旦所有这些异步请求都解决了,我想返回它们。我读到你可以用 $q.all(...)

代码如下:

Factory.firstAsyncRequest(id).then(function (arrayWithObjects) {
var promises = [];
var dataArr = [];
  angular.forEach(arrayWithObjects, function (object, key) {
     var deferred = $q.defer();
     promises.push(deferred);
     Factory.otherAsyncRequest(key).then(function (objectData) {
        dataArr.push({
           name: objectData.name,
           key: key,
           status: objectData.status
        });
        deferred.resolve();
        console.info('Object ' + key + ' resolved');
     });
  });
  $q.all(promises).then(function () {
     $rootScope.data = dataArr;
     console.info('All resolved');
  });});

从控制台我看到 $q.all 在每个对象之前被解析。我是不是搞错了什么?这似乎对每个人都有效...

非常感谢您的帮助,整晚都在寻找,现在是早上 5:30,哈哈..

干杯

编辑: 所以对于以后来这里的人来说:这只是 promises.push(deferred.PROMISE) 位。 Tho,我读到 anguar.forEach 实际上不是推荐的遍历数组的方法,因为它最初不是为最终用户使用而构建的。不知道这是否正确,但如果您不想使用 angular.forEach,我想出了另一种方法:

Users.getAll(uid).then(function (users) {
          var uids = ObjHandler.getKeys(users); //own function just iterating through Object.keys and pushing them to the array
          var cntr = 0;
          function next() {
            if (cntr < uids.length) {
              Users.getProfile(uids[cntr]).then(function (profile) {
                var Profile = {
                  name: profile.name,
                  key: uids[cntr],
                  status: profile.status
                });
                dataArr[uids[cntr]] = Profile;
                if(cntr===uids.length-1) {
                  defer.resolve(); 
                  console.info('Service: query finished');
                } else {cntr++;next}
              });
            }
          }
          next();
        });

还有getKey函数:

.factory('ObjHandler', [
function () {
  return {
    getKeys: function(obj) {
      var r = [];
      for (var k in obj) {
        if (!obj.hasOwnProperty(k))
          continue;
        r.push(k)
      }
      return r
    }
  };
}])

【问题讨论】:

  • 现在是早上 5:40 ;)
  • 解析数据,不要推入数组;然后它将在回调中可用。 $q.all 解析为结果数组。
  • @elclanrs:我通常会这样做,但实际上我不是将数据推送到数组,而是通过“dataArr[key] = objectData”手动设置键。你不能用决心做到这一点,对吗?
  • 如果angular.forEach 不打算供最终用户使用,他们为什么要在AngularJS function components angular.forEach API Reference 中发布它?

标签: javascript angularjs loops foreach promise


【解决方案1】:

代替

promises.push(deferred);

试试这个:

promises.push(deferred.promise);

【讨论】:

    猜你喜欢
    • 2017-12-16
    • 2017-11-01
    • 1970-01-01
    • 2022-12-08
    • 2020-05-15
    • 2015-11-13
    • 2019-04-26
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多