我有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请求的新手 谢谢!
答案 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]。
因此,你应该拥有你想要的东西:
<强> demo 强>