一旦所有请求完成,我们如何识别哪个ajax失败了多个ajax请求?

时间:2018-03-15 09:59:37

标签: javascript ajax

我有两个ajax调用,即

var ajax1 = $.ajax({ url: Url1 });

var ajax2 = $.ajax({ url: Url2 });

$.when(ajax1, ajax2).then(function (response1, response2) {

});

我们希望有条件地处理这些API延迟请求的失败案例:

  1. 如果ajax1成功且ajax2成功:请致电WinAjax1_WinAjax2();
  2. 如果ajax1成功且ajax2失败:请致电WinAjax1_LoseAjax2();
  3. 如果ajax1失败且ajax2成功:请致电LoseAjax1_WinAjax2();
  4. 如果ajax1失败且ajax2失败:请致电LoseAjax1_LoseAjax2();
  5. 如果我将逻辑放在相应ajax的.fail中,我就不知道其他ajax的响应是什么。如果我将.fail置于.when的失败状态,我无法确定它是哪个失败。

    有人可以帮助我在完成所有请求后如何确定哪个ajax失败了多个ajax请求?

3 个答案:

答案 0 :(得分:1)

jQuery延迟对象有一个state method。因此,您可以使用$.when并在失败时检查每个延迟对象的状态。

var d1 = jQuery.Deferred();
var d2 = jQuery.Deferred();


$.when(d1, d2).then(function(v1, v2) {
 // do something on succes
}).fail(function() {
  console.log(d1.state()); // resolved
  console.log(d2.state()); // rejected
});

d1.resolve( "Fish" );
d2.reject( "Pizza fail" );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

编辑:似乎我错过了你的主要目标。如果您需要等到所有请求都完成(已解决或拒绝)。然后$.when对此无效,因为一旦请求被拒绝而不等待其他请求,它将被拒绝。

在这种情况下,我建议您在完成所有请求时进行计数。然后检查他们的状态。

var d1 = jQuery.Deferred();
var d2 = jQuery.Deferred();
var activeRequests = 2;

function onComplete() {
  activeRequests--;
  
  if (!activeRequests) {
    // check deferred object states here
    console.log(d1.state()); 
    console.log(d2.state());
  }
}

d1.always(onComplete);
d2.always(onComplete);

d2.reject( "Pizza fail" );
d1.resolve( "Fish" );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

答案 1 :(得分:1)

答案与提到的解决方案here完全相同。

var d1 = $.Deferred();
var d2 = $.Deferred();

var j1 = $.getJSON(...).complete(d1.resolve);
var j2 = $.getJSON(...).complete(d2.resolve);

$.when(d1,d2).done(function() {
     // will fire when j1 AND j2 are both resolved OR rejected
     // check j1.isResolved() and j2.isResolved() to find which failed
});

答案 2 :(得分:0)

你可以在ajax调用之后显式调用一个函数,它会检查所有ajax调用是否成功。例如:

var ajax1_success = false,
    ajax1_called = false,
    ajax2_success = false,
    ajax2_called = false;

var afterAjax = function () {
    if (!(ajax1_called && ajax2_called)) {
        return;
    }

    // add conditionals here
};


var ajax1 = $.ajax({ url: Url1 })
    .success(function() {
        ajax1_success = true;
    }).always(function() {
        ajax1_called = true;
        afterAjax();
    });


var ajax2 = $.ajax({ url: Url2 })
    .success(function() {
        ajax2_success = true;
    }).always(function() {
        ajax2_called = true;
        afterAjax();
    });