Chcę usunąć niektóre kolekcje mongodb, ale jest to zadanie asynchroniczne. Kod będzie wyglądał następująco:
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');
Konsola wyświetla:
all dropped
dropped
dropped
dropped
Jaki jest najprostszy sposób, aby upewnić się, że all dropped
zostanie wydrukowany po upuszczeniu wszystkich kolekcji? Aby uprościć kod, można użyć dowolnej firmy zewnętrznej.
javascript
node.js
asynchronous
mongoose
synchronous
Freewind
źródło
źródło
forEach
jest synchroniczny. Zajrzyj tutaj: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ... NaforEach
dole jest implementacja . Nie wszystko z callbackiem jest asynchroniczne.Użyj obietnic .
Spowoduje to usunięcie każdej kolekcji, drukowanie „porzuconych” po każdej z nich, a następnie wydrukowanie „wszystkich usuniętych” po zakończeniu. Jeśli wystąpi błąd, zostanie wyświetlony
stderr
.Poprzednia odpowiedź (poprzedza natywną obsługę obietnic przez Node):
Użyj obietnic Q lub obietnic Bluebird .
Z Q :
Z Bluebird :
źródło
require('bluebird')
.promisifyAll
funkcji.function abc(data){
, ponieważ nie jest tak.function abc(err, callback){...
Zasadniczo nie sądzę, aby wszystkie funkcje przyjmowały błąd jako pierwszy parametr, a wywołanie zwrotne jako drugi parametr.map(function(name) { return conn.collection(name).drop() })
Można to zrobić, przekazując zadaniom wywołanie zwrotne, które aktualizuje udostępniony licznik. Kiedy wspólny licznik osiągnie zero, wiesz, że wszystkie zadania zostały zakończone, więc możesz kontynuować normalny przepływ.
Oczywiście istnieje wiele sposobów na uczynienie tego rodzaju kodu bardziej ogólnym lub wielokrotnego użytku, a każda z wielu bibliotek programowania asynchronicznego powinna mieć co najmniej jedną funkcję do tego rodzaju.
źródło
Rozwijając @freakish odpowiedź, async oferuje również każdą metodę, która wydaje się szczególnie odpowiednia dla twojego przypadku:
IMHO, dzięki temu kod jest zarówno wydajniejszy, jak i bardziej czytelny. Pozwoliłem sobie usunąć
console.log('dropped')
- jeśli chcesz, użyj zamiast tego:źródło
Robię to bez zewnętrznych bibliotek:
źródło
Wszystkie odpowiedzi są dość stare. Od początku 2013 roku Mongoose zaczął stopniowo obsługiwać obietnice dla wszystkich zapytań, więc myślę, że byłby to zalecany sposób tworzenia struktury kilku wywołań asynchronicznych w wymaganej kolejności.
źródło
Dzięki
deferred
(kolejnej obietnicy / odroczonej realizacji) możesz:źródło
Jeśli używasz Babel lub takich transpilerów i używasz async / await, możesz zrobić:
źródło
drop()
i oczekiwać zwrotu obietnicy. Czy możesz naprawić i usunąć ten przykładonDrop
?