如果你想捕获一个 Promise 的失败并将其转换为成功,你可以使用then的 failFilter来返回一个已解决的 Promise,如下所示:
deferredCall.then(function(answer) {
// this is success. you might transform the answer here.
return transformed;
}, function() {
// this is a fail. you might resolve the fail with an empty object.
return $.Deferred().resolve({}).promise();
});
这样做将确保链条可以继续通过故障而不会中断。
因此,对于您的示例,您可以这样做:
$.when([
a.ajax(),
b.ajax().then(function(answer) {
return answer;
}, function() {
return $.Deferred().resolve({}).promise();
}),
c.ajax()
]).then(function(results) {
// etc.
});
示例 2:在我的应用程序中,我有时使用then来获取特定实体的关系数据,并允许 404 指示不存在此类关系:
getEntity(id).then(function(entity) {
return getAssociation(id).then(function(association) {
entity.association = association;
return entity;
}, function() {
entity.association = null;
return $.Deferred().resolve(entity).promise();
});
}).done(function(entity) {
// etc.
});
请注意,较旧的答案建议使用管道方法。自 jQuery 1.8 起,此方法已被弃用。