Ajax-处理jquery$.when中的404错误
因此,我有以下代码:Ajax-处理jquery$.when中的404错误,jquery,ajax,Jquery,Ajax,因此,我有以下代码: function ajax1(url) { return $.ajax({ url: url }); } function ajax2(url) { return $.ajax({ url: url }); } function ajax3(url) { return $.ajax({ url: url }); } function ajax4(url) { ret
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(ajax1(url), ajax2(url), ajax3(url), ajax4(url)).done(function(a1, a2, a3, a4){
});
现在,让我们假设一个Ajax调用,ajax2
,将返回404错误
即使返回404错误,如何防止脚本执行并仍然返回某些内容(如false,使用a2
变量访问)
非常感谢您。不要从$调用done()
。当()
时,请尝试然后()
在JSFIDLE中,检查控制台以查看失败请求的响应
JQuery的when().then()
可以使用两个函数,第一个函数将在所有请求都解决时触发,类似于done()
的工作方式,第二个函数将在任何请求失败时触发,并将失败请求的响应传递给您的函数,这样您就可以使用它做任何事情
希望有帮助:)
更多信息
编辑:此解决方案将阻止您访问所有其他成功请求的响应。谢谢你指出这一点@charlietfl jQuery 3延期符合要求。这意味着您可以向请求中添加一个catch()
无论何时从catch()
返回,它都会解析承诺,返回的内容将传递给链中的下一个then()
函数ajax1(url){
返回$.ajax({
url:url
})
.然后(数据=>数据)
.捕获(故障);
}
函数解析失败(jqXhr){
//返回你想要的任何东西。我添加了状态,以防感兴趣
//可以返回'false'或字符串或其他任何内容
//如果需要,还可以将任何问题记录回服务器
返回{
错误:正确,
状态: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');
//也可以将“$.when”替换为“Promise.all()`
$.when(请求、请求2、请求3)。然后(函数(r1、r2、r3){
//根据catch()中返回的内容验证参数
console.log('r1',r1);
console.log('r2',r2);//从catch()返回的对象
console.log('r3',r3);
});代码>
。作为控制台包装{最大高度:100%!重要;顶部:0}
上的最后一位可能对您有所帮助:
当两个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(函数(xhr){
console.log(xhr);
}
);代码>
相关:@Barmar看了一下,仍然不确定我将如何实现您使用的jQuery的哪个版本?是3+?@charlietfl是的,谢谢你。但是,onSuccess console.log不会启动?@SergiuTripon它不会启动,原因与您的原始代码不会启动的原因相同t@charlietfl,不知道你的意思。。。但是,如果您将url2更改为与url1相同的内容,那么它肯定会起作用,这样实际上就不会失败。但是OP不希望一个请求失败阻止其他请求成功。仔细阅读问题。换句话说……无论请求的状态如何,您的onError
都不应该同意该措辞有点笨拙,但请继续阅读关于访问a2
的内容,无论是否为404,并且能够访问良好的请求,也不知道这是如何回答问题的。Op希望这样,无论状态如何,myFunc总是会激发,而myFailure永远不会激发!谢谢!这就是我想要的。一个问题是。那么ajax1()
中是否需要(data=>data)
?语法似乎不正确。它的箭头函数语法相当于then(函数(数据){returndata})
。您想在$中看到什么取决于您自己。如果您使用Promise.all()
而不是$。当时,只有数据会显示而不显示该步骤