5

我正在使用下面的代码从多个 url 获取 JSON。但是,当其中一个 URL 失败或获得 404 响应时,执行的功能不起作用。我阅读了 jquery 文档,我知道无论其中一个调用失败,都应该执行“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

4 回答 4

5

看看always方法。它将在这两种情况下执行。例如:

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

为响应成功的交易,参数与 .done() 相同(即 a = data,b = jqXHR),对于失败的交易,参数与 .fail() 相同(即 a = jqXHR,b = errorThrown)。(C)

于 2013-07-29T15:15:51.550 回答
3

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

不,只有当所有传递的对象都实现时,承诺才会实现。如果其中一个失败,结果将被拒绝。

有没有办法制作 do_something(data); 无论失败与否都执行。

你可以使用.always

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

然而,您可能希望在所有calls问题都解决后执行回调(无论是完成还是拒绝) - 就像allSettled在 Q 中一样。使用 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);
}); 
于 2013-07-29T15:16:15.317 回答
2

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

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

如果您想调用相同的回调而不考虑成功和失败,请使用deferred.always()文档):

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

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

于 2013-07-29T15:03:33.443 回答
2

作为 jQuery 文档,该.then函数在您的情况下需要两个(或三个)参数deferred.then( doneCallbacks, failCallbacks )

所以你需要指定第二个函数来处理失败的请求。

IE

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

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

希望这可以帮助

于 2013-07-29T15:03:58.477 回答