Tengo un evento de clic que dispara 3 llamadas ajax:
$("#button").click(function(e) { e.preventDefault(); $.ajax(call1); $.ajax(call2); $.ajax(call3); some_function() //should fire off AFTER all ajax calls are complete }); ¿Hay alguna manera de confirmar que todas las llamadas ajax se han activado ANTES de activar mi función some_function() ?
¡Gracias por adelantado!
Puedes usar $.cuando
Proporciona una forma de ejecutar funciones de devolución de llamada basadas en uno o más objetos, generalmente objetos diferidos que representan eventos asincrónicos.
$.when($.ajax(call1), $.ajax(call2), $.ajax(call3)) .done(function () { some_function(); });Si (por alguna razón) tiene una serie de promesas, puede llamar a este método usando Function.prototype.apply() :
$.when.apply($, ajaxArray) .done(function () { some_function(); });Te sugiero que uses async: false y coloques $.ajax dentro de otro ajax, algo así...
$.ajax({ async: false, // ... complete: function() { $.ajax({ // second ajax async: false, // ... complete: function() { $.ajax({ // second ajax async: false, // ... complete: function() { some_function(); } }); } }); } });Depende si necesita respuestas exitosas, pero considere lo siguiente:
$.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(); }); }); });Se puede leer mucho más sobre los objetos diferidos de jQuery y las promesas de ES6.
Si desea establecer un tiempo de espera y no le importa el resultado, establezca la opción de tiempo de espera `$.ajax({url: " http://some.url.example.com/endpoint ", timeout: 500})
O
Establezca una variable en cada uno y use window.setTimeout para verificar cuándo se configuraron todos, pero eso es horrible.