假设以下内容:
$.when(
$.ajax({
url: '/this/one/is/critical'
}),
$.ajax({
url: '/can/live/without'
}) // recoverable failure
).done(function (getCriticalData, getOptionalData) {
console.log('we are done.');
}).fail(function () {
console.error('it cannot be done!');
});
按原样,如果任一调用失败,.fail
处理程序将触发。我想要的是(以语法上优雅的方式)配置第二个ajax调用,用空对象替换错误响应(例如{}
或[]
)。
我可以用.done
替换.always
处理程序,但这需要单独解析每个参数数组(getCriticalData
和getOptionalData
)(n> 2时可能会变得难看)。我正在寻找一个布尔状态 - 所有关键请求都成功了吗?
答案 0 :(得分:2)
你需要"赶上"第二个ajax的错误并确保错误处理程序在promise链中传播所需的恢复值。
与其他一些承诺库不同,jQuery承诺没有.catch()
方法,但你想要的仍然在语法上非常简单。 jQuery的模式不是$.ajax(...).catch()
,而是$.ajax(...).then(null, errorHandler)
,其中errorHandler
返回使用所需恢复值解析的承诺。
$.when(
$.ajax({
url: '/this/one/is/critical'
}),
$.ajax({
url: '/can/live/without'
}).then(null, function() {
return $.when([]); // return a new promise resolved with a recovery value.
})
).done(function (getCriticalData, getOptionalData) {
console.log('we are done.');
}).fail(function () {
console.error('it cannot be done!');
});