我正在进行多次API调用,之后我想加载每次调用的组合结果:
$.when(
$.get(localAPI, data, function(response) {
globalStore.localShares = Number(response);
}),
$.get(facebookAPI, '', function(response){
globalStore.facebookShares = Number(response[0].share_count);
}),
$.getJSON(pinterestAPI, {url: url}).done(function(response){
globalStore.pinterestShares = Number(response.count);
})
).always(function(){
//Do stuff
});
如果$.get
调用失败,$.always
回调函数仍会执行。
但是
如果只有一个$.get
调用失败,则会取消之前调用的操作。
因此,如果第一次调用失败,globalStore
将返回两个项目。如果第一个调用成功但第二个调用失败,则globalStore
仅返回一个项目。如果前两个调用成功但最后一个调用失败,globalStore
将返回空。
有什么方法吗?
修改
是的,我试图在$.when
范围内处理失败,如下所示:
$.when(
$.get(mu30_ajax_frontend.ajaxurl, data, function(response) {
globalStore.localShares = Number(response);
}).fail(function(){
globalStore.localShares = 0;
}),
$.get(facebookAPI, '', function(response){
globalStore.facebookShares = Number(response[0].share_count);
}).fail(function(){
globalStore.facebookShares = 0;
}),
$.getJSON(pinterestAPI, {url: url}).done(function(response){
globalStore.pinterestShares = Number(response.count);
}).fail(function(){
globalStore.pinterestShares = 0;
})
).always(function(){
//Do stuff
});
但我得到的结果相同。
答案 0 :(得分:5)
当使用$.when
时,没有办法解决这个问题,如果一个请求失败,整个链都会失败。
你必须自己动手,使用延迟来知道呼叫何时全部完成,并且总是成功解决等等。
var defs = [new $.Deferred(), new $.Deferred(), new $.Deferred()];
$.get(localAPI, data, function(response) {
globalStore.localShares = Number(response);
defs[0].resolve(true);
}).fail(defs[0].resolve);
$.get(facebookAPI, '', function(response){
globalStore.facebookShares = Number(response[0].share_count);
defs[1].resolve(true);
}).fail(defs[1].resolve);
$.getJSON(pinterestAPI, {url: url}).done(function(response){
globalStore.pinterestShares = Number(response.count);
defs[2].resolve(true);
}).fail(defs[2].resolve);
$.when.apply($, defs).then(function(result) {
// result is an array, any true value is a successful request "[true, true, true]"
});
详细地写了,这可以通过一些函数和循环等来实现。
答案 1 :(得分:0)
我认为我需要的解决方案实际上很简单。我不关心成功或失败,我只是想知道ajax何时完成。所以:
$.get(mu30_ajax_frontend.ajaxurl, data, function(response) {
globalStore.localShares = Number(response);
});
$.get(facebookAPI, '', function(response){
globalStore.facebookShares = Number(response[0].share_count);
});
$.getJSON(pinterestAPI, {url: url}).done(function(response){
globalStore.pinterestShares = Number(response.count);
});
$(document).ajaxStop(function(){
//Do stuff
});
答案 2 :(得分:0)
来自jQuery $.when()
文档(强调我的):
在将多个Deferred对象传递给jQuery.when()的情况下,该方法从新的“master”Deferred对象返回Promise,该对象跟踪已传递的所有Deferred的聚合状态。一旦所有延期解决方案解决,该方法将解决其主延期;或者一旦延迟其中一个延期被拒绝,拒绝主延期。
因此,如果其中一个传递的承诺被拒绝/失败,则jQuery.when
将立即失败。