我有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上遇到了故障,并且无法检查services2和3是否正常。

到目前为止,无论我是对还是错,寻找3种服务完成的唯一方法是:

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


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

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

最佳答案

这一切都是关于捕获错误(在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

关于javascript - $ .when(ajax 1,ajax 2,ajax3).always(ajax 1,ajax 2,ajax3)在3个请求完成之前触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32853851/

10-11 23:52