Ajax - 在jquery $ .when中处理404错误

时间:2018-01-10 23:10:43

标签: 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) {
    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变量访问)?

非常感谢你。

3 个答案:

答案 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>