Я хочу удалить несколько коллекций mongodb, но это асинхронная задача. Код будет:
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');
На консоли отображается:
all dropped
dropped
dropped
dropped
Как самый простой способ убедиться, что all dropped
все коллекции будут напечатаны? Для упрощения кода можно использовать любую стороннюю организацию.
javascript
node.js
asynchronous
mongoose
synchronous
Freewind
источник
источник
forEach
синхронный. Посмотрите здесь: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... Там же реализацияforEach
на дне. Не все с обратным вызовом асинхронно.Используйте обещания .
Это отбрасывает каждую коллекцию, печатая «отброшено» после каждой, а затем печатает «все отброшено» по завершении. В случае возникновения ошибки отображается значение
stderr
.Предыдущий ответ (это предшествует встроенной поддержке Promises в Node):
Используйте обещания Q или обещания Bluebird .
С Q :
С Bluebird :
источник
require('bluebird')
.promisifyAll
функцию.function abc(data){
, потому что это не похоже наfunction abc(err, callback){...
В принципе, я не думаю, что все функции принимают ошибку как первый параметр и обратный вызов как второй параметр.map(function(name) { return conn.collection(name).drop() })
Способ сделать это - передать задачам обратный вызов, который обновляет общий счетчик. Когда общий счетчик достигает нуля, вы знаете, что все задачи завершены, поэтому вы можете продолжить свой обычный поток.
Конечно, есть много способов сделать такой код более универсальным или многоразовым, и любая из многих библиотек асинхронного программирования должна иметь по крайней мере одну функцию для этого.
источник
Расширяя ответ @freakish, async также предлагает метод each, который кажется особенно подходящим для вашего случая:
ИМХО, это делает код более эффективным и разборчивым. Я взял на себя смелость удалить
console.log('dropped')
- если вы этого хотите, используйте вместо этого:источник
Я делаю это без внешних библиотек:
источник
Все ответы довольно старые. С начала 2013 года Mongoose начал постепенно поддерживать обещания для всех запросов, так что я думаю, это будет рекомендуемый способ структурировать несколько асинхронных вызовов в требуемом порядке в будущем.
источник
С помощью
deferred
(другого обещания / отложенной реализации) вы можете:источник
Если вы используете Babel или подобные транспилеры и используете async / await, вы можете сделать:
источник
drop()
и ожидать возврата Promise. Не могли бы вы исправить этот пример и удалитьonDrop
?