2010-05-28 16 views
9

Imagine que tenemos que las fuentes que debe solicitar ajax. Quiero realizar algunas acciones cuando se activan todas las devoluciones de llamadas. ¿Cómo se puede hacer esto, además de este enfoque:La mejor solución para esperar a que se ejecuten todas las devoluciones de llamada ajax

(function($){ 
    var sources = ['http://source1.com', 'http://source2.com'], 
    guard = 0, 
    someHandler = function() { 
    if (guard != sources.length) { return; } 
    //do some actions 
    }; 

    for (var idx in sources) { 
    $.getJSON(sources[idx], function(){ guard++; someHandler(); }) 
    } 
})(jQuery) 

Lo que no me gusta es que en este caso no puedo manejar la respuesta no (por ejemplo, no puedo establecer el tiempo de espera para la respuesta a venir.) Y enfoque general (supongo que debería haber una forma de usar más poder de programación funcional aquí)

¿Alguna idea?

¡Recuerdos!

UPD: Gracias por la solución con el encadenamiento de devoluciones de llamada. Encontré un buen enfoque here:. esto es lo que se propone en los comentarios:

(function hidenext(jq){ 
    jq.eq(0).fadeOut("fast", function(){ 
     (jq=jq.slice(1)).length && hidenext(jq); 
    }); 
})($('div#bodyContent a')) 

Con un poco de ajustar se puede esperar a la última devolución de llamada.

Ahora quiero gestionar solicitudes de larga ejecución correctamente. ¿Alguna pista?

+0

Esto se ha preguntado antes, pero en lugar de XHR, era una serie de eventos DOM. Tampoco puedo recordar el nombre de la pregunta. –

Respuesta

0

tal vez usted podría 'en cascada' las descargas, por lo que la devolución de llamada de la primera getJSON desencadena descarga desde el siguiente origen, y así sucesivamente? Luego, en la última devolución de llamada, no le quedan fuentes y puede llamar a su función 'hecho'.

+0

Sí, ¡es una buena idea! Voy a intentar eso y estar de vuelta. Pero sigue siendo un problema con la respuesta fallida ... – glaz666

+0

@ glaz666: ¿Por qué no puede establecer un tiempo de espera o definir una devolución de llamada de error que maneja el error? –

+0

¿Cómo configuro el tiempo de espera? :) Error call call back – glaz666

0

Siempre puede usar $ .ajax con "async: false" en las opciones y/o usar devoluciones de llamada correctas (beforeSend, error, dataFilter, success y complete).

+1

'async: false' congelará la IU del navegador mientras se realizan las solicitudes. –

+0

async: falso - puede ser una opción, gracias. Pero en caso de 'éxito' o 'completo', no funcionará, ya que será lo mismo con jQuery – glaz666

+0

Realmente recomiendo no utilizar async: falso, la experiencia del usuario nunca es demasiado buena con ese tipo de solicitudes. – SBUJOLD

2

duplicados de javascript: execute a bunch of asynchronous method with one callback

function createCallback(limit, fn){ 
    var finishedCalls = 0; 
    return function(){ 
     if (++finishedCalls == limit){ 
      fn(); 
     } 
    }; 
} 


var callback = createCallback(4, function(){ 
    alert("woot!"); 
}); 


async1(callback); 
async2(callback); 
async3(callback); 
async4(callback); 
0

Tal vez estoy equivocado - pero la regla es: la serialización de AJAX - uno a la vez por lo que tiene a la cadena que - cada respuesta (devolver la llamada función) debe presentar la siguiente en orden

*. onreadystatechange le dará control (una función que es)) cuando esté listo - aquí puede enviar el siguiente uno por turno

Cuestiones relacionadas