我有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/