如何使用Deferred处理多个ajax请求错误?

时间:2017-06-19 02:02:43

标签: javascript jquery

我在处理多个jquery ajax调用时遇到一些问题,有超时错误,但我怎么知道这是哪个请求错误?

$.when(ajaxDeferred1, ajaxDeferred2)
  .done(function(result1, result2) {})
  .fail(function(response, statusText) {
  // how do I know which(ajaxDeferred1 or ajaxDeferred2) ajax call error this is?
});

ajaxDeferred1

$.ajax({
  method: 'GET',
  url: xxx,
  timeout: 5000,
});

我知道我可以通过放置' .fail()'来处理错误。在每个请求上,但有没有办法处理上面的错误?

更进一步,我能这样处理吗?

$.when(ajaxDeferred1, ajaxDeferred2)
  .done(function(result1, result2) {})
  .fail(function(errorForRequest1, errorForRequest2) {
  // handle error
});

修改

我想我需要更清楚地提出问题。在上面的例子中:

$.when(ajaxDeferred1, ajaxDeferred2)
  .done(function(result1, result2) {})
  .fail(function(errorForRequest1, errorForRequest2) {
  // if all request has done, but one or more request has got error, return the error here then! 
  // So I can handle which part UI should show and which UI part I should hide due to the error!
});

我想完成'结果一切都没有错误,并得到错误'当所有完成但是一个或多个请求遇到问题并将它们全部一起返回到' .fail()'。

2 个答案:

答案 0 :(得分:1)

您可以使用var promises = [ajaxDeferred1, ajaxDeferred2] $.when.apply($, promises) .always(function() { $.each(promises, function(i) { this.done(function(result) { console.log('promise', i, 'resolved'); }).fail(function(error) { console.log('promise', i, 'failed'); }); }); }); 并在其中迭代每个承诺并检查它是否已解决或失败。

{{1}}

JSFiddle演示:https://jsfiddle.net/pr45eov1/3/

答案 1 :(得分:1)

我喜欢@Miguel Mota的回答。但作为替代方案,如果失败,您将获得延迟对象。所以你可以添加一些数据:

var dfd1 = jQuery.ajax({
    method: 'GET',
    url: 'some request that fails first',
    timeout: 1
});

dfd1.id = 1;

var dfd2 = jQuery.ajax({
    method: 'GET',
    url: 'some request that fails second',
    timeout: 1000
});

dfd2.id = 2;

jQuery.when(dfd1, dfd2)
    .done(function () { })
    .fail(function (request) {
        // id: 1
        console.log('id: ' + request.id);
    });