![](/img/trans.png)
[英]How to make an ajax call for each element of an array of objects, using promises?
[英]How to wait for AsyncRequests for each element from an array using reduce and promises
我是AngularJS和JavaScript的新手。
我正在獲取陣列(汽車)中每個元素的遠程信息,並創建一個新的陣列(感興趣的潛在客戶)。 因此,我需要同步請求。 我需要以與汽車相同的順序將每個請求的響應添加到新數組中。
我首先使用for來做到這一點:
for (a in cars) {
//async request
.then(function () {
//update the new array
});
}
這發出了所有請求,但是自然不會更新新數組。
在論壇上進行搜索后,我發現了這些出色的示例和說明,這些示例和說明用於返回中間承諾並同步所有它們。
1. http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html
2. http://stackoverflow.com/questions/25605215/return-a-promise-from-inside-a-for-loop
3. http://www.html5rocks.com/en/tutorials/es6/promises/
(@ MaurizioIndenmark,@ Mark Rajcok,@ Michelle Tilley,@ Nolan Lawson)
我無法使用第二個參考中建議的Promise.resolve()。 所以我用$q.defer()
和resolve()
。 我想我必須注入依賴項或其他我錯過的東西。 如下所示:
在控制器中,我有:
$scope.interestedProspects = [] ;
RequestDetailsOfAsync = function ($scope) {
var deferred = $q.defer();
var id = carLists.map(function (car) {
return car.id;
}).reduce(function (previousValue, currentValue) {
return previousValue.then(function () {
TheService.AsyncRequest(currentValue).then(function (rData) {
$scope.interestedProspects.push(rData);
});
});
}, deferred.resolve());
};
在服務中,我有類似以下內容:
angular.module('app', []).factory('TheService', function ($http) {
return {
AsyncRequest = function (keyID) {
var deferred = $q.defer();
var promise = authorized.get("somep.provider.api/theService.json?" + keyID).done(function (data) {
deferred.resolve(data);
}).fail(function (err) {
deferred.reject(err);
});
return deferred.promise;
}
}
}
我收到的顯示錯誤: Uncaught TypeError: previousValue.then is not a function
我提供了一個jsfiddle,可復用其他資源,以便更輕松地解決此http://jsfiddle.net/alisatest/pf31g36y/3/ 。 如何使用reduce和promises等待數組中每個元素的AsyncRequests
我不知道這些錯誤是否是:
javascript有時會先看到previousValue和currentValue,就像Promise的類型一樣,然后再看成一個數字。 在jsfiddle中,我有一個使用reduce的有效示例和該示例的http請求。
似乎您正在對id數組調用reduce
,但是在傳遞的函數中假設您正在處理promise。
通常,當您要同步一組承諾時,可以使用$ q.all
您傳遞了一組諾言,並獲得了另一個諾言,該諾言將通過一系列結果來解決。
查看此模式以了解您想要做什么:
cars.reduce(function(promise, car) {
return promise.then(function(){
return TheService.AsyncRequest(car).then(function (rData) {
$scope.details.push(rData);
});
});
}, $q.when());
這將完全按照汽車數組中的順序對所有汽車進行所有異步調用。 如果異步調用的順序$q.all
則$q.all
可能也足夠。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.