sql >> Base de Datos >  >> NoSQL >> MongoDB

Looping Array y verificación de la colección MongoDB en bucle (Async)

La clave general para el procesamiento asincrónico es que desea tener alguna indicación de cuándo finaliza la iteración actual antes de pasar a la siguiente iteración. Dado que las operaciones reales como .find() aquí ellos mismos emplean una "devolución de llamada" que se "llama" cuando la operación se completa con una respuesta, entonces lo que generalmente desea hacer es llamar a algo que signifique el final de la iteración en la misma sección de código.

De manera básica, puede obtener un resultado similar al que puede obtener en los bucles tradicionales con "async.eachSeries " método, que solo permitirá que se lleve a cabo "una iteración a la vez":

function check (collection) {
    var records = [ { body: "Test 1"}, { body: "Test 2" } ];
    async.eachSeries(records,function(item,callback) {
        collection.find( item, function (err, rows) {
            console.log(rows);
            callback(err)
        });
    },function(err) {
        if (err) throw err;
        console.log("done");
    });
}

Entonces, cada uno de los argumentos de la matriz se pasan a la función "iterador" aquí como un parámetro de "elemento", y un segundo argumento es una función de "devolución de llamada" que se usará más adelante. Cada vez que se llama al iterador, ese argumento se pasa a .find() método que a su vez tiene una "devolución de llamada" propia, donde se da la respuesta "error" o "documentos".

Dentro de esa devolución de llamada, se llama a la "devolución de llamada" proporcionada por la función "iterador" para señalar la finalización de esa iteración actual. Esto permite que la función "cada" aquí continúe y, de hecho, llame a la próxima "iteración" y procese el siguiente elemento de la matriz.

Teniendo en cuenta sus antecedentes, tenga en cuenta la forma correcta de anotar una "matriz" en JavaScript con [] corchetes como se muestra. Esta es generalmente una diferencia importante cuando se trabaja con arreglos.

Hay otras variaciones de "async.each" y "async.eachLimit" ambos permiten cierto grado de procesamiento paralelo, pero el método "Series" hace las cosas "en orden" de una manera a la que está acostumbrado con los bucles tradicionales.

Entonces, donde las operaciones de bucle son "sin bloqueo", debe indicar cuándo se completa ese bucle antes de continuar.