使用延迟对象捕获分离失败

catch separated fails using deferred object

我得到了这个代码(使用 jquery)

function getData(applyFunction, callback) {
$.when(
    $.getJSON("http://www.mocky.io/v2/59d72b5b120000c902cb1b4f"),
    $.getJSON("http://www.mocky.io/v2/59d72b5b120000c902cb1b4f"),
).done(function(
    firstData,
    secondData
){
    callback(applyFunction, {
        firstDataToApply: { data: firstData.popup },
        secondDataToApply: { data: secondData.popup }
    })
})
}

有没有办法从 $.getJSON 部分(或 when 部分)捕获单独的错误,记录这些错误,并且仍然能够发送 firstDatasecondData(同时)到回调函数?

(我知道如果 $.getJSON 中的一些或两者都失败,我将向回调发送空数据,并且在弹出窗口之前必须进行空检查)

抱歉让您感到困惑 post,在此先感谢您

是的。 Promises 是管道,管道中的每个处理程序都可以转换通过的值或错误,因此如果您真的想要通过添加 catch 处理程序并返回,您可以将失败变成 "success with null" null(或任何你想将错误转换成的值)。请参阅下面的 catch 调用以及评论:

function getData(applyFunction, callback) {
    $.when(
        $.getJSON("http://www.mocky.io/v2/59d72b5b120000c902cb1b4f")
            .catch(function(err) {
                console.error(err);
                return null;
            }),
        $.getJSON("http://www.mocky.io/v2/59d72b5b120000c902cb1b4f")
            .catch(function(err) {
                console.error(err);
                return null;
            })
    ).done(function(firstData, secondData) {
        callback(applyFunction, {
            firstDataToApply: {
                data: firstData.popup    // You'll need checks on this!
            },
            secondDataToApply: {
                data: secondData.popup   // And this!
            }
        });
    });
}

当然,如果你要多次这样做,你可以避免重复自己的功能:

function getJSONOrNull(url) {
    return $.getJSON(url).catch(function(err) {
        console.error(err);
        return null;
    });
}

然后

function getData(applyFunction, callback) {
    $.when(
        getJSONOrNull("http://www.mocky.io/v2/59d72b5b120000c902cb1b4f"),
        getJSONOrNull("http://www.mocky.io/v2/59d72b5b120000c902cb1b4f")
    ).done(function(firstData, secondData) {
        callback(applyFunction, {
            firstDataToApply: {
                data: firstData.popup    // You'll need checks on this!
            },
            secondDataToApply: {
                data: secondData.popup   // And this!
            }
        });
    });
}