MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Looping-Array und Überprüfung der MongoDB-Sammlung in Schleife (Async)

Der allgemeine Schlüssel zur asynchronen Verarbeitung ist, dass Sie einen Hinweis darauf haben möchten, wann die aktuelle Iteration abgeschlossen ist, bevor Sie mit der nächsten Iteration fortfahren. Da die eigentlichen Operationen wie .find() hier selbst einen "Rückruf" verwenden, der "aufgerufen" wird, wenn die Operation mit einer Antwort abgeschlossen ist, dann möchten Sie normalerweise etwas aufrufen, das Ihr Ende der Iteration im selben Codeabschnitt anzeigt.

Grundsätzlich können Sie mit der "async.eachSeries" ein ähnliches Ergebnis erzielen wie in herkömmlichen Schleifen " Methode, die nur "eine Iteration auf einmal" stattfinden lässt:

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

So wird jedes der Array-Argumente hier als ein „item“-Parameter an die „Iterator“-Funktion übergeben, und ein zweites Argument ist eine später zu verwendende „Callback“-Funktion. Jedes Mal, wenn der Iterator aufgerufen wird, wird dieses Argument an .find() übergeben Methode, die wiederum einen eigenen "Callback" hat, wo die Antwort "error" oder "documents" gegeben wird.

Innerhalb dieses Rückrufs wird dann der von der „Iterator“-Funktion bereitgestellte „Rückruf“ aufgerufen, um den Abschluss dieser aktuellen Iteration zu signalisieren. Dadurch kann die "each"-Funktion hier fortfahren und tatsächlich die nächste "Iteration" aufrufen und das nächste Array-Element verarbeiten.

Beachten Sie Ihren Hintergrund und beachten Sie die korrekte Notation eines "Arrays" in JavaScript mit [] Klammern wie abgebildet. Dies ist im Allgemeinen ein wichtiger Unterschied bei der Arbeit mit Arrays.

Es gibt andere Variationen von "async.each" und "async.eachLimit" die beide ein gewisses Maß an paralleler Verarbeitung ermöglichen, aber die "Series"-Methode erledigt die Dinge "in der Reihenfolge", wie Sie es von traditionellen Schleifen gewohnt sind.

Wenn also Schleifenoperationen "nicht blockierend" sind, müssen Sie angeben, wann diese Schleife abgeschlossen ist, bevor Sie fortfahren möchten.