【问题标题】:catch separated fails using deferred object使用延迟对象捕获分离失败
【发布时间】:2017-10-06 07:18:22
【问题描述】:

我得到了这段代码(使用 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 中的一些或两个都失败了,我会向回调发送空数据,并且在弹出窗口之前必须进行空检查)

抱歉,这篇文章令人困惑,在此先感谢

【问题讨论】:

    标签: javascript jquery jquery-deferred


    【解决方案1】:

    是的。 Promise 是管道,管道中的每个处理程序都可以转换传递的值或错误,因此如果您真的想要通过添加 catch 处理程序并返回,您可以将失败转换为“null 成功” null (或您想要将错误转换为的任何值)来自它。请参阅下面的 catch 调用以及 cmets:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多