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.then
en este caso, solo para su información_.when
que no necesite usarloapply
.apply
: developer.mozilla.org/en-US/docs/JavaScript/Reference/… .Respuestas:
.apply
se 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..apply
tambié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$.when
no funcionaría, porque espera que sus parámetros sean promesas, no una matriz.Ahí es donde
.apply
entra en juego . Toma la matriz y llama$.when
con cada elemento como parámetro (y se asegura de quethis
esté configurado enjQuery
/$
), entonces todo funciona :-)fuente
$.when
solo 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á
everythingDone
tan 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
resolveWith
para obtener algunos parámetros, se rompe debido a la promesa inicial establecida en indefinida. Lo que hice para que funcionara:fuente