使用' null对象替换jQuery ajax错误响应'

时间:2015-11-18 06:55:44

标签: jquery error-handling jquery-deferred

假设以下内容:

$.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处理程序,但这需要单独解析每个参数数组(getCriticalDatagetOptionalData)(n> 2时可能会变得难看)。我正在寻找一个布尔状态 - 所有关键请求都成功了吗?

1 个答案:

答案 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!');
});