当一些调用工作而其他调用失败时,$ q.all()会发生什么?

Ala*_*an2 64 javascript angularjs angular-promise

当一些调用工作而其他调用失败时,$ q.all()会发生什么?

我有以下代码:

    var entityIdColumn = $scope.entityType.toLowerCase() + 'Id';
    var requests = $scope.grid.data
      .filter(function (rowData, i) {
          return !angular.equals(rowData, $scope.grid.backup[i]);
      })
      .map(function (rowData, i) {
          var entityId = rowData[entityIdColumn];
          return $http.put('/api/' + $scope.entityType + '/' + entityId, rowData);
      });
    $q.all(requests).then(function (allResponses) {
        //if all the requests succeeded, this will be called, and $q.all will get an
        //array of all their responses.
        console.log(allResponses[0].data);
    }, function (error) {
        //This will be called if $q.all finds any of the requests erroring.
        var abc = error;
        var def = 99;
    });
Run Code Online (Sandbox Code Playgroud)

当所有$ http调用都工作时,allResponses数组将填充数据.

当一个人失败时,我的理解是第二个函数将被调用,错误变量给出详细信息.

但是有人可以帮我解释一下如果某些响应有效并且其他响应失败会发生什么?

Cha*_*ani 40

我相信,因为promise库是基于Q实现的,所以只要第一个promise被拒绝,就会调用拒绝回调并显示错误.它不等待其他承诺得到解决.请参阅Q https://github.com/kriskowal/q的文档.对于Q.all,这就是所提到的

all函数返回值数组的promise.当履行此承诺时,数组包含原始承诺的履行值,其顺序与承诺相同.如果其中一个给定的承诺被拒绝,则立即拒绝返回的承诺,而不是等待批次的其余部分.


Vex*_*ter 39

自问题发布以来已经有一段时间了,但也许我的回答可能仍然对某人有所帮助.我通过简单地解决所有承诺解决了类似的问题,但是我可以稍后处理返回并查看是否有任何错误.这是我用来预加载一些图像资源的示例:

var loadImg = function(imageSrc) {
    var deferred = $q.defer();

    var img = new Image();
    img.onload = function() {
        deferred.resolve({
            success: true,
            imgUrl: imageSrc
        });
    };
    img.onerror = img.onabort = function() {
        deferred.resolve({
            success: false,
            imgUrl: imageSrc
        });
    };
    img.src = imageSrc;

    return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)

后来我可以看出哪些是错误的:

var promiseList = [];
for (var i = 0; i < myImageList.length; i++) {
    promiseList[i] = loadImg(myImageList[i]);
}
$q.all(promiseList).then(
    function(results) {
        for (var i = 0; i < results.length; i++) {
            if (!results[i].success) {
                // these are errors
            }
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

  • 真的很好.:) (2认同)

Mar*_*ruf 6

编辑:仅在Kris Kowal的Q中得到支持 - 但仍然是一个有用的花絮

如果你想要处理所有这些而不立即拒绝使用 allSettled

以下是文档所说的内容:

如果您要等待所有承诺要么已履行或被拒绝,您可以使用allSettled.

Q.allSettled(promises)
.then(function (results) {
    results.forEach(function (result) {
        if (result.state === "fulfilled") {
            var value = result.value;
        } else {
            var reason = result.reason;
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

  • `allSettled`是[kriskowal的Q](http://documentup.com/kriskowal/q/)的一部分,但不是Angular $ q实现的一部分. (10认同)

小智 5

这是一个小答案.在这个小提琴中你可以看到它是如何工作的,如果在某些承诺中发生错误.

$q.all([test1(), test2()]).then(function() {
  // success
}, function() {
  // error
});
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/wd9w0ja4/