如何在其中一个JSON请求失败时执行$

时间:2013-07-29 14:58:24

标签: javascript jquery html json

我正在使用以下代码从多个网址获取JSON。但是,当其中一个URL失败或获得404响应时,执行功能不起作用。我读了jquery doc,我知道“then”应该执行,无论其中一个调用失败了。

var data = {};
var calls = [];
for (var i in funcs) {
    calls.push(
        $.getJSON(base_url+i,
            (function(i) {
                return function(d) {
                    data[i] = d;
                };
            }(i)) 
        )
    );
}
$.when.apply($,calls).then(function() {
    do_something(data);
}); 

4 个答案:

答案 0 :(得分:5)

查看always方法。它将在both cases中执行。 例如:

$.when.apply($, calls).always(function() { 
    alert('Resolved or rejected'); 
});

对于成功的事务,参数与.done()相同(即a = data,b = jqXHR),对于失败的事务,参数与.fail()相同(即a = jqXHR,b = errorThrown)。 (c)

答案 1 :(得分:2)

您需要使用deferred.then()documentation)的第二个参数:

$.when.apply($, calls).then(function() {
    do_something(data);
}, function() {
    // something failed
});

如果您想要调用相同的回调而不管成功和失败,请使用deferred.always()documentation):

$.when.apply($, calls).always(function() {
    do_something(data);
});

还值得阅读jQuery.when() documentation,它解释了传递多个延迟对象时的聚合。

答案 2 :(得分:2)

作为jQuery文档,.then函数在您的案例中deferred.then( doneCallbacks, failCallbacks )

需要两个(或三个)参数

因此,您需要指定第二个函数来处理失败的请求。

$.when.apply($,calls).then(function() {
    alerT('ok');
}, function() {
    alert('fail');
});

这是一个简单的小提琴:http://jsfiddle.net/rrMwr/

希望这有帮助

答案 3 :(得分:2)

  

我读了jquery文档,我知道“然后”应该执行,无论其中一个调用失败了。

不,只有在满足传递对象的所有的情况下,承诺才会得到满足。如果其中一个失败,结果将被拒绝。

  

有没有办法制作do_something(数据);无论是否失败都执行。

您可以使用.always

// doSomething waits until all are fulfilled or one is rejected
$.when.apply($,calls).always(do_something);

然而,你可能想要在所有calls被解决后执行回调(无论是否已经完成或被拒绝) - 就像Q中的allSettled一样。使用jQuery,你必须解决一些问题:

var calls = $.map(funcs, function(_, i) {
    var d = new $.Deferred;
    $.getJSON(base_url+i).done(function(r/*…*/) {
        d.resolve(i, r);
    }, function(/*…*/) {
        d.resolve();
    });
    return d.promise();
});
$.when.apply($, calls).then(function() {
    var data = {};
    for (var i=0; i<arguments.length; i++)
        data[arguments[i][0]] = arguments[i][1];
    do_something(data);
});