Estoy leyendo sobre diferidos y promesas y sigo encontrándome $.when.apply($, someArray). No tengo claro qué hace esto exactamente, buscando una explicación de que una línea funciona exactamente (no todo el fragmento de código). Aquí hay algo de contexto:
var data = [1,2,3,4]; // the ids coming back from serviceA
var processItemsDeferred = [];
for(var i = 0; i < data.length; i++){
processItemsDeferred.push(processItem(data[i]));
}
$.when.apply($, processItemsDeferred).then(everythingDone);
function processItem(data) {
var dfd = $.Deferred();
console.log('called processItem');
//in the real world, this would probably make an AJAX call.
setTimeout(function() { dfd.resolve() }, 2000);
return dfd.promise();
}
function everythingDone(){
console.log('processed all items');
}
javascript
jquery
asynchronous
promise
manafire
fuente
fuente

.done()se puede usar en lugar de.thenen este caso, solo para su información_.whenque no necesite usarloapply.apply: developer.mozilla.org/en-US/docs/JavaScript/Reference/… .Respuestas:
.applyse usa para llamar a una función con una matriz de argumentos. Toma cada elemento de la matriz y usa cada uno como parámetro de la función..applytambién puede cambiar el contexto (this) dentro de una función.Entonces, tomemos
$.when. Se usa para decir "cuando todas estas promesas se resuelvan ... haz algo". Requiere un número infinito (variable) de parámetros.En su caso, tiene una serie de promesas; no sabe a cuántos parámetros está pasando
$.when. Pasar la matriz en sí a$.whenno funcionaría, porque espera que sus parámetros sean promesas, no una matriz.Ahí es donde
.applyentra en juego . Toma la matriz y llama$.whencon cada elemento como parámetro (y se asegura de quethisesté configurado enjQuery/$), entonces todo funciona :-)fuente
$.whensolo espera a que finalicen todos antes de continuar.$.when($, arrayOfPromises).done(...)y$.when(null, arrayOfPromises).done(...)(que encontré como soluciones propuestas en los foros ...)$ .when toma cualquier número de parámetros y se resuelve cuando todos se han resuelto.
anyFunction .apply (thisValue, arrayParameters) llama a la función anyFunction configurando su contexto (thisValue será el this dentro de esa llamada de función) y pasa todos los objetos en arrayParameters como parámetros individuales.
Por ejemplo:
Es lo mismo que:
Pero la aplican forma de llamar le permite pasar una matriz de número desconocido de parámetros. (En su código, está diciendo que sus datos provienen de un servicio, entonces esa es la única forma de llamar a $ .when )
fuente
Aquí, el código completamente documentado.
fuente
$.when.apply($, array)no es lo mismo que$.when(array). Es lo mismo que:$.when(array[0], array[1], ...)Lamentablemente no puedo estar de acuerdo con ustedes.
Llamará
everythingDonetan pronto como se rechace uno de los aplazados , incluso si hay otros aplazados pendientes .Aquí está el script completo (recomiendo http://jsfiddle.net/ ):
¿Es esto un error? Me gustaría usar esto como lo describió el caballero arriba.
fuente
Quizás alguien pueda encontrar esto útil:
EverythingDone no se llama en caso de rechazo
fuente
$ .when solo hace posible que se llame a una devolución de llamada cuando todas las promesas que se le pasan se resuelven / rechazan. Normalmente, $ .cuando toma un número variable de argumentos, usar .apply hace posible pasarle una matriz de argumentos, es muy poderoso. Para obtener más información sobre .apply: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply
fuente
Gracias por tu elegante solución:
Solo un punto: cuando se usa
resolveWithpara obtener algunos parámetros, se rompe debido a la promesa inicial establecida en indefinida. Lo que hice para que funcionara:fuente