2016-01-09 129 views
1

我知道這已經被問了好幾次了,但經過一天的搜索,我仍然沒有得到它的工作,儘管它就像是一個解決方案無處不在...等待angular.forEach循環內的承諾

我有一個異步請求到數據庫,它返回一個數組數組。對於這個數組中的每個對象,我需要向數據庫啓動另一個異步請求,並且一旦所有這些異步請求都解決,我想返回它們。我看了你可以用$ 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(延遲.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 
    } 
    }; 
}]) 
+0

這是上午5點40分給我;) –

+0

解析數據,不要將其推送到數組;那麼它將在回調中可用。 '$ q.all'解析爲一組結果。 – elclanrs

+0

@elclanrs:我通常會這樣做,但實際上我並不是將數據推送到數組,而是通過'dataArr [key] = objectData'手動設置鍵。你無法解決問題,可以嗎? –

回答

1

而不是

promises.push(deferred); 

試試這個:

promises.push(deferred.promise); 
+0

就是這樣! Darrrnn。巨大的謝謝! –