我知道這已經被問了好幾次了,但經過一天的搜索,我仍然沒有得到它的工作,儘管它就像是一個解決方案無處不在...等待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
}
};
}])
這是上午5點40分給我;) –
解析數據,不要將其推送到數組;那麼它將在回調中可用。 '$ q.all'解析爲一組結果。 – elclanrs
@elclanrs:我通常會這樣做,但實際上我並不是將數據推送到數組,而是通過'dataArr [key] = objectData'手動設置鍵。你無法解決問題,可以嗎? –