MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Looping Array e controllo della raccolta MongoDB in loop (Async)

La chiave generale per l'elaborazione asincrona è che si desidera avere qualche indicazione di quando viene eseguita l'iterazione corrente prima di passare all'iterazione successiva. Poiché le operazioni effettive come .find() qui stessi utilizzano un "callback" che viene "chiamato" quando l'operazione viene completata con una risposta, quindi quello che di solito vuoi fare è chiamare qualcosa che indica la fine dell'iterazione nella stessa sezione di codice.

In pratica, puoi ottenere un risultato simile a quello che puoi fare nei loop tradizionali con "async.eachSeries " metodo, che consentirà solo "un'iterazione alla volta":

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");
    });
}

Quindi ciascuno degli argomenti dell'array viene passato alla funzione "iteratore" qui come parametro "elemento" e un secondo argomento è una funzione di "callback" da utilizzare in seguito. Ogni volta che viene chiamato l'iteratore, quell'argomento viene passato a .find() metodo che a sua volta ha una propria "richiamata", in cui viene fornita la risposta "errore" o "documenti".

All'interno di tale callback, viene quindi chiamato il "callback" fornito dalla funzione "iteratore" per segnalare il completamento dell'iterazione corrente. Ciò consente alla funzione "ciascuna" qui di continuare e in effetti chiamare l'"iterazione" successiva ed elaborare l'elemento dell'array successivo.

Notando il tuo background, tieni presente il modo corretto per annotare un "array" in JavaScript con il [] parentesi come mostrato. Questa è generalmente una differenza importante quando si lavora con gli array.

Esistono altre varianti di "async.each" e "async.eachLimit" che entrambi consentono un certo grado di elaborazione parallela, ma il metodo "Serie" fa le cose "in ordine" in un modo a cui sei abituato con i loop tradizionali.

Quindi, dove le operazioni di loop sono "non bloccanti", devi indicare quando quel loop viene completato prima di voler andare avanti.