Quiero eliminar algunas colecciones de mongodb, pero esa es una tarea asincrónica. El código será:
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');
La consola muestra:
all dropped
dropped
dropped
dropped
¿Cuál es la forma más sencilla de asegurarse de all dropped
que se imprima después de que se hayan eliminado todas las colecciones? Se puede utilizar cualquier tercero para simplificar el código.
javascript
node.js
asynchronous
mongoose
synchronous
Freewind
fuente
fuente
forEach
es sincrónico. Eche un vistazo aquí: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Hay una implementación deforEach
en la parte inferior. No todo con devolución de llamada es asincrónico.Utilice promesas .
Esto descarta cada colección, imprimiendo "descartadas" después de cada una y luego imprime "todas descartadas" cuando se completa. Si ocurre un error, se muestra a
stderr
.Respuesta anterior (esto es anterior al soporte nativo de Node para Promises):
Use promesas Q o promesas Bluebird .
Con Q :
Con Bluebird :
fuente
require('bluebird')
.promisifyAll
función.function abc(data){
, porque no es comofunction abc(err, callback){...
Básicamente, no creo que todas las funciones tomen el error como primer parámetro y la devolución de llamada como segundo parámetro.map(function(name) { return conn.collection(name).drop() })
La forma de hacerlo es pasar a las tareas una devolución de llamada que actualiza un contador compartido. Cuando el contador compartido llegue a cero, sabrá que todas las tareas han finalizado para que pueda continuar con su flujo normal.
Por supuesto, hay muchas formas de hacer que este tipo de código sea más genérico o reutilizable y cualquiera de las muchas bibliotecas de programación asíncrona que existen debería tener al menos una función para hacer este tipo de cosas.
fuente
Ampliando la respuesta @freakish, async también ofrece cada método, que parece especialmente adecuado para su caso:
En mi humilde opinión, esto hace que el código sea más eficiente y más legible. Me he tomado la libertad de eliminar el
console.log('dropped')
, si lo desea, use esto en su lugar:fuente
Hago esto sin bibliotecas externas:
fuente
Todas las respuestas son bastante antiguas. Desde principios de 2013, Mongoose comenzó a admitir promesas gradualmente para todas las consultas, por lo que supongo que esa sería la forma recomendada de estructurar varias llamadas asíncronas en el orden requerido en el futuro.
fuente
Con
deferred
(otra promesa / implementación diferida) puede hacer:fuente
Si está usando Babel o tales transpilers y usa async / await, puede hacer:
fuente
drop()
y esperar devolver una Promesa. ¿Puedes arreglar este ejemplo y eliminarloonDrop
?