所以我有以下代码:
function ajax1(url) {
return $.ajax({
url: url
});
}
function ajax2(url) {
return $.ajax({
url: url
});
}
function ajax3(url) {
return $.ajax({
url: url
});
}
function ajax4(url) {
return $.ajax({
url: url
});
}
然后我运行Ajax调用并使用$.when
访问每个调用返回的数据:
$.when(ajax1(url), ajax2(url), ajax3(url), ajax4(url)).done(function(a1, a2, a3, a4){
});
现在,假设其中一个Ajax调用ajax2
将返回404错误。
即使返回404错误,如何阻止脚本执行并仍返回某些内容(如false,使用a2
变量访问)?
非常感谢你。
答案 0 :(得分:3)
jQuery 3延迟符合Promises A+。这意味着您可以在请求承诺中添加catch()
每当您从catch()
返回时,它会解析承诺,并且返回的内容将传递给链中的下一个then()
function ajax1(url) {
return $.ajax({
url: url
})
.then(data => data)
.catch(resolveFailure);
}
function resolveFailure(jqXhr) {
// return whatever you want here. I added the status in case that is of interest
// could return `false` or string or whatever
// can also log any issues back to server if needed
return {
error: true,
status: jqXhr.status,
statusText: jqXhr.statusText
};
}
var req = ajax1('https://api.myjson.com/bins/l9ywp'),
req2 = ajax1('https://httpbin.org/FAIL'),
req3 = ajax1('https://api.myjson.com/bins/l9ywp');
// could also replace `$.when with `Promise.all()`
$.when(req, req2, req3).then(function(r1, r2, r3) {
// validate the arguments based on whatever you return in the catch()
console.log('r1', r1);
console.log('r2', r2);// object returned from catch()
console.log('r3', r3);
});
.as-console-wrapper {max-height: 100%!important;top:0}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
答案 1 :(得分:0)
而不是从done()
致电$.when()
,请尝试then()
,如下所示:
https://jsfiddle.net/L83ny70k/
在JSFiddle中检查您的控制台以查看失败请求的响应!
JQuery的when().then()
可以使用2个函数,第一个将在所有请求解析时触发,类似于done()
的工作方式,如果任何请求失败并且将通过,则第二个将触发失败的请求对你的功能的反应,这样你就可以用它做你想做的事了!
希望有所帮助:)
更多信息
https://api.jquery.com/jquery.when/
https://api.jquery.com/deferred.then/
编辑:此解决方案将阻止您访问所有其他成功请求的响应。感谢你指出@charlietfl!
答案 2 :(得分:0)
$.when() documentation上的最后一位可能会对您有所帮助:
当两个ajax请求成功时执行函数myFunc,或者 myFailure,如果其中一个有错误。
示例:
$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) )
.then( myFunc, myFailure );
现在,如果您想知道单个呼叫的失败,您还可以获取每个呼叫的单独状态代码,以便进行如下呼叫:
function ajax2(url) {
return $.ajax({
url: url
});
}
可以转换为:
function ajax2(url) {
var isGoodResponse = $.ajax(url).always(function(xhr){
console.log(xhr);
// do whatever checks you want here
return xhr.statusCode === '404';
});
// returns true/false
return isGoodResponse;
}
例如:
$.ajax("http://false-url.duh")
.always(function(xhr){
console.log(xhr);
}
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>