2011-07-16 13 views
5

Estoy haciendo en el código algunas solicitudes con JQuery y get. Parece que:¿Cómo llamar la alerta después de que se hayan realizado todas las solicitudes de Ajax?

$.get('address1', function() { ... }); 
$.get('address2', function() { ... }); 
$.get('address3', function() { ... }); 

// This code should be runned when all 3 requests are finished 
alert('Finished'); 

así, ¿hay alguna manera de detectar si todavía hay solicitud de procesamiento y ejecutar código marcado sólo cuando hayan terminado los 3 peticiones.

Gracias.

Respuesta

13

Puede hacer uso de deferred objects[docs] introducido en jQuery 1.5:

$.when(
    $.get('address1', function() { ... }), 
    $.get('address2', function() { ... }), 
    $.get('address3', function() { ... }) 
).then(function() { 
    alert('Finished'); 
}); 

Referencia:jQuery.when

El centro de aprendizaje jQuery tiene un bonito introduction to deferred objects/promises.

+0

Si la llamada de 'get' está en funciones divididas? ¿Puedo hacer algo como: '$ .when (function() {doRequest1(); doRequest2(); doRequest3();}). Then (function() {...});'? – Ockonal

+1

@Ockonal: simplemente devuelva los objetos prometidos devueltos por '$ .get':' function() {return $ .get (...)} '. Luego puede hacer '$ .when (doRequest1(), doRequest2(), doRequest3()) ...'. Eche un vistazo a la documentación y ejemplos, los objetos diferidos pueden ser difíciles de entender, pero son bastante poderosos. –

0
var fin1 = false; 
var fin2 = false; 
var fin3 = false; 

$.ajax({ 
    url: "address1", 
    success: function(){ 
    fin1 = true; 
    fnUpdate(); 
    } 
}); 

$.ajax({ 
    url: "address2", 
    success: function(){ 
    fin2 = true; 
    fnUpdate(); 
    } 
}); 

$.ajax({ 
    url: "address3", 
    success: function(){ 
    fin3 = true; 
    fnUpdate(); 
    } 
}); 

function fnUpdate(){ 
    if(fin1 && fin2 && fin3){ 
    alert('fin'); 
    } 
} 
+0

¿Qué pasa si una solicitud tiene un error? Luego, técnicamente, los tres están "terminados", pero no se ve ninguna alerta. – rvighne

+0

Por supuesto, puede agregar una devolución de llamada de error y luego puede hacer su propia lógica de negocio para manejarlo. – ysrb

0
var count = 0; 
$.get('address1', function() { count++; ... }); 
$.get('address2', function() { count++; ... }); 
$.get('address3', function() { count++; ... }); 

var int = setInterval(function() { 
    if (count === 3) { 
     clearInterval(int); 
     alert('done'); 
    } 
}, 10); 
2
var isFinished = []; 

$.get('address1', function() { isFinshed.push["address1"]; allDone(); }); 
$.get('address2', function() { isFinshed.push["address2"]; allDone(); }); 
$.get('address3', function() { isFinshed.push["address3"]; allDone();}); 

var allDone = function(){ 
    if(isFinished.length < 3)return 

    alert('Finished'); 
}; 
Cuestiones relacionadas