Ich möchte einige Mongodb-Sammlungen löschen, aber das ist eine asynchrone Aufgabe. Der Code lautet:
var mongoose = require('mongoose');
mongoose.connect('mongo://localhost/xxx');
var conn = mongoose.connection;
['aaa','bbb','ccc'].forEach(function(name){
conn.collection(name).drop(function(err) {
console.log('dropped');
});
});
console.log('all dropped');
Die Konsole zeigt Folgendes an:
all dropped
dropped
dropped
dropped
Was ist der einfachste Weg, um sicherzustellen all dropped
, dass gedruckt wird, nachdem alle Sammlungen gelöscht wurden? Jeder Drittanbieter kann verwendet werden, um den Code zu vereinfachen.
javascript
node.js
asynchronous
mongoose
synchronous
Freilauf
quelle
quelle
forEach
ist synchron. Schauen Sie hier: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Es gibtforEach
unten eine Implementierung von . Nicht alles mit Rückruf ist asynchron.Verwenden Promises .
Dadurch wird jede Sammlung gelöscht, nach jeder wird "gelöscht" gedruckt, und nach Abschluss wird "alle gelöscht" gedruckt. Wenn ein Fehler auftritt, wird er angezeigt
stderr
.Vorherige Antwort (dies datiert die native Unterstützung von Node für Versprechen vor):
Verwenden Sie Q- Versprechen oder Bluebird- Versprechen.
Mit F :
Mit Bluebird :
quelle
require('bluebird')
.promisifyAll
Funktion zu verwenden.function abc(data){
, weil es nicht so ist.function abc(err, callback){...
Grundsätzlich denke ich nicht, dass alle Funktionen Fehler als ersten Parameter und Rückruf als zweiten Parameter annehmen.map(function(name) { return conn.collection(name).drop() })
Der Weg, dies zu tun, besteht darin, den Aufgaben einen Rückruf zu übergeben, der einen gemeinsam genutzten Zähler aktualisiert. Wenn der gemeinsam genutzte Zähler Null erreicht, wissen Sie, dass alle Aufgaben abgeschlossen sind, sodass Sie mit Ihrem normalen Ablauf fortfahren können.
Natürlich gibt es viele Möglichkeiten, diese Art von Code allgemeiner oder wiederverwendbarer zu machen, und jede der vielen asynchronen Programmierbibliotheken sollte mindestens eine Funktion haben, um diese Art von Dingen auszuführen.
quelle
Async erweitert die Antwort von @freakish und bietet außerdem jede Methode an, die für Ihren Fall besonders geeignet zu sein scheint:
Meiner Meinung nach macht dies den Code sowohl effizienter als auch lesbarer. Ich habe mir erlaubt, das zu entfernen
console.log('dropped')
- wenn Sie es wollen, verwenden Sie stattdessen Folgendes:quelle
Ich mache das ohne externe Bibliotheken:
quelle
Alle Antworten sind ziemlich alt. Seit Anfang 2013 hat Mongoose damit begonnen, Versprechen für alle Abfragen schrittweise zu unterstützen. Dies wäre also die empfohlene Methode, um mehrere asynchrone Aufrufe in der erforderlichen Reihenfolge zu strukturieren.
quelle
Mit
deferred
(einem weiteren Versprechen / einer verzögerten Implementierung) können Sie Folgendes tun:quelle
Wenn Sie Babel oder solche Transpiler verwenden und async / await verwenden, können Sie Folgendes tun:
quelle
drop()
ein Versprechen weiterleiten und erwarten, dass es zurückgegeben wird. Können Sie dieses Beispiel bitte beheben und entfernenonDrop
?