javascript - promises - ¿Cuál es la devolución de llamada y error en async.whilst utilizado?
funciones asincronas javascript (2)
Intento usar async.whilst para regenerar un número aleatorio entre 0 y la longitud de una matriz, hasta que la longitud del elemento en este índice sea mayor que una longitud especificada. Quería usar async.whilst para esto, pero la sintaxis no es del todo clara para mí. Pensé en hacer lo siguiente:
var selectParagraph = function(paragraphs, callback){
var index = Math.floor(Math.random() * paragraphs.length
async.whilst(
function(){
return paragraphs[index].length < minParagraphLength;
},
function(cb) {
index = Math.floor(Math.random() * paragraphs.length);
},
function(err) {
console.log(paragraphs[index]);
callback(err, paragraphs[index]);
}
}
Sin embargo, esto no funciona. Supongo que es porque no usé el cb para la segunda función en ningún lado, pero no sé exactamente cómo debería usarlo. ¿Acabo de llamar a cb () después de cambiar el índice? ¿Qué contiene exactamente la variable err?
Supongo que es porque no utilicé la devolución de llamada para la segunda función en cualquier lugar
Sí exactamente. async.js
espera que vuelvas a llamar cuando termines, y cuando no lo hagas, no continuará con la próxima iteración.
pero no sé exactamente cómo debería usarlo
No debe usarlo en absoluto, ya que no está haciendo nada asincrónico. Use un ciclo estándar do while
while:
do {
var index = Math.floor(Math.random() * paragraphs.length);
} while (paragraphs[index].length < minParagraphLength)
console.log(paragraphs[index]);
callback(null, paragraphs[index]); // not sure where you''re getting `callback` from
Como Bergi ya ha notado , no está haciendo nada asincrónico y no necesita usar nada en absoluto. Sin embargo, abordaré su confusión específica sobre cómo funciona.
El segundo argumento para whilst
es una función que puede realizar operaciones asincrónicas. whilst
no tiene forma de saber cuándo la función está "lista" con todo lo que necesita hacer. El parámetro de devolución de llamada es una forma de señal a whilst
que esta función ha completado todas sus tareas, y whilst
puede pasar a la siguiente iteración.
Supongamos que queremos hacer un mensaje de consola de serie cada segundo aparte. (Este es un ejemplo bastante artificial, pero no puedo pensar en un ejemplo natural que sea más fácil de explicar).
var i = 0;
async.whilst(
function(){ return i < 5; },
function(cb) {
setTimeout(function() {
console.log(i++);
cb();
}, 1000);
},
function(err) { console.err("we encountered an error", err); }
);
En este caso, llamamos a setTimeout
y luego whilst
no ejecuta la siguiente iteración hasta que se llame a cb()
en la resolución de setTimeout
. Si whilst
ejecutaba la próxima iteración tan pronto como la función finalizara, todas las llamadas a setTimeout
se pondrían en cola al mismo tiempo, en lugar de ejecutarse en segundo después de otro. En cambio, espera hasta que la función llame a cb()
.
Dado que nunca llamas a cb()
en tu código, whilst
asumes que la función ha enviado una tarea asíncrona que lleva mucho tiempo. whilst
que no ejecutará la siguiente iteración hasta que la primera llamada de función confirme que se hace llamando a cb()
.
Una llamada a cb()
sin argumentos indica que la función completó sus tareas sin problemas. Si la función finalizó con un error (no se pudo leer un archivo, no se pudo acceder a un recurso de red), entonces se puede suministrar ese error como argumento a cb
(p. Ej. cb(new Error("could not reach the server"));
) y el error se proporcionará al argumento de la tercera función de while.