2016-03-10 143 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

嗯,我寧願暗示錯誤是處理的,但我明白你在說什麼。 –