我试图使用 $q.all 等待所有承诺都得到解决,但它是在第一个承诺完成后调用的!
我做错了什么?
function sendAudits(audits) {
var promises = [];
$scope.sendAudits = {
progress: 0
};
angular.forEach(audits, function (audit, idAudit) {
promises.push(saveAudit(audit));
});
$q
.all(promises)
.then(function (data) {
console.log(data);
}, function (errors) {
console.log(errors);
});
}
function saveAudit(audit) {
var filename = audit.header.id + ".txt";
return $http({
method: 'PUT',
url: '/audits/audits.php?filename=' + encodeURIComponent(filename),
data: AuditSvc.getPlainAudit(audit.header.id)
}).finally(function () {
$scope.sendAudits.progress += 1;
console.log("FINALLY: " + audit.header.id);
});
}
EDIT
稍微深入分析一下问题,当某些响应有错误时,就会出现这种情况。例如当服务器返回时header("HTTP/1.0 418 I'm A Teapot: " . $filename);
,客户端控制台将类似于:
PUT http://localhost:8182/audits/audits.php?filename=1.txt 418 (I'm A Teapot: 1.txt)
FINALLY: 1
Object {data: "", status: 418, config: Object, statusText: "I'm A Teapot: 1.txt"}
PUT http://localhost:8182/audits/audits.php?filename=2.txt 418 (I'm A Teapot: 2.txt)
FINALLY: 2
PUT http://localhost:8182/audits/audits.php?filename=3.txt 418 (I'm A Teapot: 3.txt)
FINALLY: 3
PUT http://localhost:8182/audits/audits.php?filename=4.txt 418 (I'm A Teapot: 4.txt)
FINALLY: 4
$q.all
is 没有弹性
正如其他人指出的那样,$q.all
is 没有弹性。如果其中一项承诺被拒绝,$q.all
因第一个错误而被拒绝。
创建一个有弹性的复合承诺,即等待所有承诺完成通过或失败的承诺,使用.catch
对每个人的承诺convert被拒绝的承诺到成功的承诺。
var resilientPromises = [];
angular.forEach(promises, function(p) {
var resilientP = p.catch( function(result) {
//return to convert rejection to success
return result;
});
resilientPromises.push(resilientP);
});
$q.all(resilientPromises).then( function (results) {
//process results
});
从这个答案中可以看出两点:
- A
$q.all
承诺是没有弹性。它被第一个拒绝的 Promise 拒绝。
- 可以通过拒绝的 Promise 创建已履行的 Promise返回onRejected 函数的值
.then
方法或.catch
method.
有关更多信息,请参阅你错过了承诺的重点 https://blog.domenic.me/youre-missing-the-point-of-promises/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)