2016-03-10 101 views
3

我有一个触发关闭3 AJAX调用click事件:事件完成

$("#button").click(function(e) { 
    e.preventDefault(); 

    $.ajax(call1); 
    $.ajax(call2); 
    $.ajax(call3); 

    some_function() //should fire off AFTER all ajax calls are complete 
}); 

有没有办法让我确认所有的Ajax调用已经被炒了鱿鱼烧了我的some_function()功能?

在此先感谢!

$.ajax({ 
    url: "http://some.url.example.com/endpoint", 
}) 
.always(function (data){ 
    // Process the data 
    $.ajax({ 
     url: "http://some.url.example.com/endpoint2", 
    }) 
    .always(function (data2){ 
     // Process the data 
     $.ajax({ 
      url: "http://some.url.example.com/endpoint3", 
     }) 
     .always(function (data) { 
      someFunction(); 
     }); 
    }); 
}); 

还有很多更多的阅读,可以对jQuery的延期对象和ES6承诺做到:

+0

做,如果他们成功了,你在乎吗? –

+0

不,我不在乎他们是否成功@NeilTwist –

+0

确认他们被解雇的唯一方法就是处理回复。您可以在我的答案中忽略数据本身。如果响应时间有问题,请设置适当的超时时间。 –

回答

2

您可以使用$.when

提供一种方法来执行基于一个回调函数或更多对象,通常表示异步事件的延迟对象。

$.when($.ajax(call1), $.ajax(call2), $.ajax(call3)) 
.done(function() { 
    some_function(); 
}); 

如果(出于某种原因)你有承诺的数组,然后你可以调用使用Function.prototype.apply()这个方法:

$.when.apply($, ajaxArray) 
.done(function() { 
    some_function(); 
}); 
+0

如果你有一组promise,为什么不使用'Promise.all()'? –

0

,如果你需要成功响应,但考虑下面的依赖。

如果你想设置超时时间,并且不关心结果,设置超时选项`$阿贾克斯(网址:{url: “http://some.url.example.com/endpoint”,超时:500})

OR

在每个设置一个变量,并使用window.setTimeout来检查它们什么时候全部被设置,但是这太可怕了。

1

我建议你使用async: false并把$.ajax另一个AJAX内,somelike这...

$.ajax({ 
    async: false, 
    // ... 
    complete: function() { 
     $.ajax({ // second ajax 
      async: false, 
      // ... 
      complete: function() { 
       $.ajax({ // second ajax 
        async: false, 
        // ... 
        complete: function() { 
         some_function(); 
        } 
       }); 
      } 
     }); 
    } 
}); 
+0

为什么需要设置'async:false'? –

+0

以确保尽管每个请求的成功跟在上面 –

+0

嗯,我宁愿暗示错误是处理的,但我明白你在说什么。 –