我正在使用以下代码从多个网址获取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);
});
答案 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);
});