当一个承诺被拒绝时,使$ q.all无声地失败

Tom*_*Tom 5 javascript promise angularjs

我正在对一些地址进行地理编码,有时其中一些地址失败.我希望能够得到剩下的结果并忽略失败的结果,这样我就可以在地图上显示其他坐标.目前$ q.all将在拒绝一个时调用errorHandler,因此我将丢失其他promise的结果.

      $q.all(promises).then(function(coords) {
          for (var j = 0;j<coords.length;j+=1) {
              //success code
          }
      }, function(error) {
        console.log("Failed",error.type,error.message);
      });
Run Code Online (Sandbox Code Playgroud)

Ben*_*aum 9

Interrobang建议的解决方案很好(减去错误)但是如果你不喜欢装饰器影响代码中的每一个承诺,你可以得到类似于allSettled的东西:

var suppress = function(x) { return x.catch(function(){}); } 
$q.all(promises.map(suppress)).then(function(coords) {
     for (var j = 0; j < coords.length ; j+=1) {
          //coords[j] contains the coords on success or is undefined on failure
      }
});
Run Code Online (Sandbox Code Playgroud)


Int*_*ang 0

你想要的是q.allSettled,它没有在 Angular 中实现。

这是请求实施的相关 GitHub 问题。

这是一种可能的实现,称为allComplete,您可以将其添加到 Angular 应用程序中:

angular.module('App.services', ['ngResource'])
  .config( function($provide) {
    $provide.decorator("$q", ["$delegate", function($delegate) {
      var $q = $delegate;

      $q.allComplete = function(promises) {

        if(!angular.isArray(promises)) {
          throw Error("$q.allComplete only accepts an array.");
        }

        var deferred = $q.defer();
        var passed = 0;
        var failed = 0;
        var responses = [];

        angular.forEach(promises, function (promise, index) {
          promise
            .then( function(result) {
              console.info('done', result);
              passed++;
              responses.push(result);
            })
            .catch( function(result) {
              console.error('err', result);
              failed++;
              responses.push(result);
            })
            .finally( function() {
              if((passed + failed) == promises.length) {
                console.log("COMPLETE: " + "passed = " + passed + ", failed = " + failed);

                if(failed > 0) {
                  deferred.reject(responses);
                } else {
                  deferred.resolve(responses);
                }
              }
            })
          ;
        });

        return deferred.promise;

      };

      return $q;
    }]);
  })
;
Run Code Online (Sandbox Code Playgroud)

  • “我刚刚发布了代码,但我不知道它是如何工作的”的想法对我来说很可怕。抱歉,如果您在这里发布代码,请承担责任,如果有错误的内容,请修复它们。 (8认同)