【发布时间】:2014-07-16 06:44:59
【问题描述】:
我必须进行一堆 JSONP 调用,并在它们全部完成(或失败)后执行一些代码。
即:
function finished() {
alert('done!');
}
function method1() {
return $.ajax('http://example.org/endpoint', {
data: {
foo: 'bar'
},
dataType: 'jsonp'
});
}
function method2() {
return $.ajax('http://example.org/endpoint', {
data: {
baz: 'qux'
},
dataType: 'jsonp'
});
}
$.when(method1(), method2()).always(finished);
唯一的问题是,如果任何请求失败,finished() 将不会被调用。
我可以尝试检测其中一个 ajax 调用是否像这样失败:
function method1() {
var method1_timeout = setTimeout(function() {
// this call has failed - do something!
}, 5000);
var ajax = $.ajax('http://example.org/endpoint', {
data: {
foo: 'bar'
},
dataType: 'jsonp',
success: function() {
clearTimeout(method1_timeout);
}
});
return ajax;
}
但我被困在了这一点上 - 我如何告诉延迟对象那个特定的 ajax 请求失败了?
我尝试调用 ajax 对象的error() 方法:
var method1_timeout = setTimeout(function() {
ajax.error();
}, 5000);
但没有运气。
有什么想法吗?
【问题讨论】:
-
将第二个函数传递给
.then(),如果有错误将被调用 - api.jquery.com/jQuery.when(在底部)。或者,可能更喜欢使用 promise 的fail方法 - api.jquery.com/deferred.fail -
对于失败的 JSONP 请求不会调用 ajax
error()方法,所以这不起作用。我已更新我的问题以使用always()。 -
我明白了,抱歉,我没有意识到是这样(我从来没有使用过 JSONP)
-
抱歉,对于您的代码,您不想使用
ajax.error()...您会使用ajax.reject()(对于您似乎想要做的事情) - api.jquery.com/deferred.reject 。这实际上改变了 Promise 的状态,这是 Promise 的回调方法所依赖的。 -
ajax是实际的 ajax 对象,而不是deferred对象...调用error()只是一个猜测,我希望它会失败。我不太确定在延迟对象上调用reject()是否是个好主意,因为这会将状态更改为立即拒绝,并立即触发我的finished()方法,即使还有其他待处理的ajax 请求。
标签: javascript jquery ajax jsonp .when