簡體   English   中英

如何使用reduce和promises等待數組中每個元素的AsyncRequests

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM