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

时间:2017-10-06 07:18:23

标签: javascript jquery jquery-deferred

我得到了这段代码(使用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部分)捕获单独的错误,记录这些错误,仍然能够同时发送firstData和{{1 (同时)回调函数?

(我知道如果某些或两个secondData失败,我会向回调发送空数据,并且必须在弹出之前进行空检查)

抱歉这个令人困惑的帖子,提前谢谢

1 个答案:

答案 0 :(得分:1)

是。 Promise是管道,管道中的每个处理程序都可以转换通过的值或错误,因此您可以使用null"将失败转化为成功。如果您真的希望通过添加catch处理程序并从中返回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!
            }
        });
    });
}