jQuery:$。当延迟的AJAX调用时 - 一个失败的调用取消其他调用

时间:2016-02-10 19:48:07

标签: javascript jquery ajax jquery-deferred

我正在进行多次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
});

但我得到的结果相同。

3 个答案:

答案 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将立即失败。