2011-04-06 9 views
10

tengo dos funciones javascript, save() y saveAll(), configurado de la siguiente manera:recaudación deferred.then jQuery() una vez que todos los objetos diferidos se han resuelto

function save(data) { 
    return $.post('/save', data); 
} 

function saveAll(callback) { 
    var dataArray = []; 
    $.each(dataArray, function() { 
     save(this); 
    }); 
    callback(); 
} 

estoy interesado en la modificación de saveAll() para que apalanca jquery aplazó objetos y aumenta la función callback una vez que todas las operaciones save() se hayan completado. sin embargo, no estoy seguro de la sintaxis exacta ... específicamente con relación al $ .each() dentro de $ .when(). sería algo como esto?

function saveAll(callback) { 
    var dataArray = []; 
    $.when(
     $.each(dataArray, function() { 
      return save(this); 
     }) 
    ).then(callback); 
} 

Respuesta

21

como señaló Eli, $ .when() acepta una lista de argumentos separados por comas y no una matriz. usar Function.apply() para pasar la matriz parece ser el truco.

function saveAll(callback) { 
    var dataArray = [], deferreds = []; 
    $.each(dataArray, function() { 
     deferreds.push(save()); 
    }); 

    $.when.apply(window, deferreds).then(callback); 
} 
+2

Esto es fantástico, estaba buscando exactamente esto. Estoy sorprendido de que jQuery no permita una variedad de objetos diferidos de forma nativa. –

+10

Solo tenga cuidado, porque un hecho poco conocido sobre $ .when es que se resolverá inmediatamente si cualquiera de los argumentos es rechazado/fallado, ¡sin esperar el resto! Es cierto :) e inesperado, si me preguntas. Escribí un $ .whenAll() que siempre espera a que se resuelvan todos los argumentos, independientemente del estado de éxito/falla: http://jsfiddle.net/InfinitiesLoop/yQsYK/ – InfinitiesLoop

1

Usted debe ser capaz de pasar una lista separada por comas de los objetos diferidos a $.when y .then se ejecutará una vez que todos ellos han resuelto.

http://api.jquery.com/jQuery.when/

1

El problema es que creo que está regresando a su $.eachdataArray, no una lista de objetos como Deferred desea alimentar a $.when.

+0

tienes razón, el valor de retorno de $ .each() no es lo que quería. Gracias. –

Cuestiones relacionadas