如何使用 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.  
 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

不知道错误有没有:

previousValue 和 currentValue 有时会被 javascript 看到,最初是 Promise 类型,然后是数字。在 jsfiddle 中,我有一个使用 reduce 的工作示例和该示例的 http 请求。

您似乎正在对一个 ID 数组调用 reduce,但假设在传递的函数中您正在处理承诺。

一般来说,当你想同步一组promise时,可以使用$q.all

您传递了一系列承诺并在 return 中获得了另一个承诺,该承诺将通过一系列结果解决。

看看这个模式,看看你想做什么:

        cars.reduce(function(promise, car) {
            return promise.then(function(){
              return TheService.AsyncRequest(car).then(function (rData) {
                $scope.details.push(rData);
              });
            });
        }, $q.when());

这将完全按照它们在汽车数组中的顺序为每辆汽车执行所有异步调用。如果进行异步调用的顺序无关紧要,$q.all 可能也足够了。