在angular.forEach循环中等待promises

时间:2016-01-09 04:37:16

标签: javascript angularjs loops foreach promise

我知道这已经被问过很多次了,但是经过一天的搜索后我仍然没有让它发挥作用,尽管它就像所有的解决方案一样......

我对数据库有一个异步请求,该数据库返回一个数据数组。对于此数组中的每个对象,我需要启动另一个异步请求到数据库,并且一旦所有这些异步请求解决,我想返回它们。我读过你可以用$ 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)位。那么,我读到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
    }
  };
}])

1 个答案:

答案 0 :(得分:2)

而不是

promises.push(deferred);

试试这个:

promises.push(deferred.promise);