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)
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)
你想要的是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)
| 归档时间: |
|
| 查看次数: |
3367 次 |
| 最近记录: |