Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax-处理jquery$.when中的404错误_Jquery_Ajax - Fatal编程技术网

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()
而不是
$。当
时,只有数据会显示而不显示该步骤