$ .when(ajax1,ajax2,ajax3).always(ajax1,ajax2,ajax3)在3个请求完成之前触发

时间:2015-09-29 21:12:18

标签: javascript jquery ajax jquery-deferred

我有3种不同的服务要求数据。如果3是成功的,我可以加载我的小部件。如果service1和/或service2关闭或响应错误,我仍然可以使用有限的功能加载我的小部件。如果service3响应错误,无论service1和2是否正常工作,都意味着完全失败,我需要显示错误消息。

所以我尝试过这样的事情:

var s1=$.ajax(url_service1);
var s2=$.ajax(url_service2);
var s3=$.ajax(url_service3);

$.when(s1,s2,s3).always(s1,s2,s3){
   //here the code that looks which services are ok or wrong 
   //to decide what to show and how;
}

但是只要其中一个服务响应错误,$ .when()。always()代码就会触发。

也是如此
$when(s1,s2,s3).then( successfunc, failurefunc)

意味着一旦触发失败回调,由于3个服务中的任何一个失败,我无法检查其他2个服务的状态。

所以也许我的service1失败了,我无法检查服务2和3是否正常。

寻找3项服务的唯一方法,无论我到目前为止找到的是对还是错,都是这样的:

$(document).ajaxStop(function(){
         console.log("finished");
});

但是,我正在开发一个小部件以插入任何页面。我希望它与其他内容隔离开来。因此,我不希望我的小部件等待整个$(文档)来解决其ajax请求,如果有的话......

希望这有一定道理。我显然是关于jquery ajax请求的新手 谢谢!

1 个答案:

答案 0 :(得分:1)

这就是捕获错误(在service1和service2上)并从中恢复。

Promise使异步错误恢复变得非常简单。在大多数承诺库中,您可以链接.catch()。 jQuery还没有这种方法(滚动jQuery v3!),但它仍然非常简单 - 链.then()并从错误处理程序返回已解析的promise。

以下是流量控制:

var s1 = $.ajax(url_service1).then(null, catch_);
var s2 = $.ajax(url_service2).then(null, catch_);
var s3 = $.ajax(url_service3);

$.when(s1, s2, s3).then(loadWidget, widgetFailure);

以下是一些示例函数:

function catch_(error) {
    // Return a fulfilled promise that delivers a detectable error code, eg -1. 
    // Any value will do, as long as it can be distinguished from a successful value.
    return $.when(-1);
}

function loadWidget(val1, val2, val3) {
    //Exactly what you write here depends on how the widget is initialized when val1 and/or val2 are missing.
    // eg ...
    if(val1 != -1 && val2 === -1) {
        //load limited widget based on val1 and val3
    } else if(val1 === -1 && val2 != -1) {
        //load limited widget based on val2 and val3
    } else if(val1 === -1 && val2 === -1) {
        //load limited widget based on val3
    } else {
        //load full widget based on val1, val2 and val3 
    }
}

function widgetFailure(error) {
    $("#errorMessage").text('Sorry, widget failed to initialize') // show error message
    console.log(error); // log error
}

注意:由于$.ajax()传递数据的方式,成功的val1 / val2 / val3将是每个包含[data,textStatus,jqXHR]的数组。您将对数据感兴趣,val1 [0] / val2 [0] / val3 [0]。

因此,你应该拥有你想要的东西:

  • 如果所有三项服务都成功,则取得成功。
  • 如果service1和/或service2失败,则部分成功。
  • 仅当service3失败时才会失败,无论service1 / service2的结果如何。

<强> demo