【问题标题】:Chaining an unknown number of promises in AngularJS在 AngularJS 中链接未知数量的 Promise
【发布时间】:2014-07-17 14:24:31
【问题描述】:

好的,假设我有一组 n XHR 请求:

var promises = [];
var AllResults = [];
$scope.requests = [
    {
        "uri":"http://foo/bar/action1",
        "name":"Action1"
    },{
        "uri":"http://bar/foo/action2",
        "name":"Action2"
    },{...},{...},{...}
];
var ParseMyResultsArray = function(){
    console.log(AllResults);
    //...
};

angular.forEach($scope.requests, function(request){
    var promise = $http.get(request.uri);
    promises.push(promise);
});

angular.forEach(promises, function(promise){
    promise.then(function(results){
        AllResults.push(results);
    });
});

//Then, when all promise are resolved...
ParseMyResultsArray();

在不知道我的 requests 数组大小的情况下解决所有承诺后,我如何确保调用 ParseMyResultsArray()

感谢您的帮助!

【问题讨论】:

    标签: angularjs promise


    【解决方案1】:

    从角度文档到$http

    $http API 基于 $q 公开的 deferred/promise API 服务。

    因此可以使用$q.all() 方法,该方法采用一组承诺,并且:

    将多个承诺组合成一个承诺,当 所有输入的承诺都已解决

    实现代码为:

    $q.all(promises).then(function () { /* All promises are resolved */ });
    

    【讨论】:

      【解决方案2】:

      我知道这个问题已经有一年多了,但值得更好的回答。

      代码可以更加简洁,并且可以避免丑陋的外部变量promisesAllResults 以及外部函数ParseMyResultsArray()

      试试...

      $scope.requests = [{
              "uri":"http://foo/bar/action1",
              "name":"Action1"
          }, {
              "uri":"http://bar/foo/action2",
              "name":"Action2"
          },{...},{...},{...
      }];
      
      $q.all($scope.requests.map(function(request) {
          return $http.get(request.uri);
      })).then(function(results) {
          console.log(results);
          //parse results array here ...
          return parsedResults;
      });
      

      如果需要进一步访问parsedResults,那么一定要保留(或返回)对$q.all(...).then(...) 返回的承诺的引用。由于获取数据涉及异步性,因此 parsedResults 的承诺将比原始的外部 var AllResults 有用得多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-18
        • 1970-01-01
        • 2013-06-03
        • 2017-07-13
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 1970-01-01
        相关资源
        最近更新 更多