在多次AJAX调用后暂停执行AJAX回调

时间:2016-04-07 14:16:19

标签: javascript ajax

我的脚本中有2个Ajax调用,每个调用都有不同的回调来执行调用成功。

ReadLink*Actions

我有另一个函数Action,我希望在所有ajax调用返回后激活,但我不希望回调($.ajax({ type: 'POST', url: "url1", success: foo1 }); $.ajax({ type: 'POST', url: "url2", success: foo2 }); Clear())将是执行直到我执行foo1

我已经找到了答案,但没有找到答案。我可以做些什么来解决这个问题?是否有任何旗帜或功能处理这类问题? 提前谢谢。

3 个答案:

答案 0 :(得分:0)

我不确定我是否同意这些现有解决方案,因为JQuery为我们提供了一个工具:$.when

https://api.jquery.com/jquery.when/

使用$.when时,JQuery会将所有承诺聚合到一个承诺中,并且只有在所有承诺解决后才能解决。如果任何承诺被拒绝,则会调用fail

const promise1 = $.Deferred();
const promise2 = $.Deferred();

promise1.resolve({data: 'Promise 1'});
promise2.resolve({data: 'Promise 2'});

$.when.apply(this, [promise1, promise2])
  .done((promise1Data, promise2Data) => {
      // All of our promises have resolved
      // And we have all our data from each promise
      // Do the work of clear() here
      console.log(promise1Data.data)
      console.log(promise2Data.data)
  })
  .fail((error) => {         
      console.error('One or more promises failed')
  });

正如我们所看到的,在这个问题的上下文中,你可以在done的{​​{1}}内做任何必要的逻辑。如果达到这一点,就可以保证所有承诺都已得到解决。

上面的代码块将以下内容输出到控制台

$.when

工作示例:http://codepen.io/mikechabot/pen/MyrJYB?editors=0011

答案 1 :(得分:-1)

如下所示,您可以实施一个简单易用的解决方案,或者如果您需要更强大的解决方案,请查看JS Promises

var foo1Data, foo2Data;
$.ajax({
  type: 'POST',
  url: "url1",
  success: function(data) {
    if (foo2Data) {
       Clear();
       foo1(data);
       foo2(foo2Data);
    }
    else {
      foo1Data = data;
    }
  }
});

$.ajax({
  type: 'POST',
  url: "url2",
  success: function(data) {
    if (foo1Data) {
       Clear();
       foo1(foo1Data);
       foo2(data);
    }
    else {
      foo2Data = data;
    }
  }
});

答案 2 :(得分:-1)

未经测试,但您可以使用when尝试使用此类内容。

// each object in responses contains the response text,
// status, and jqXHR object for each ajax call
function clear(responses) {
  // do something
  foo1(responses[0]);
  foo2(responses[1]);
};

$.when(ajax1, ajax2).done(clear);