Je veux supprimer certaines collections mongodb, mais c'est une tâche asynchrone. Le code sera:
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 console affiche:
all dropped
dropped
dropped
dropped
Quelle est la manière la plus simple de s'assurer all dropped
qu'elle sera imprimée une fois que toutes les collections auront été supprimées? N'importe quel tiers peut être utilisé pour simplifier le code.
forEach
est synchrone. Jetez un oeil ici: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... Il y a une implémentation deforEach
en bas. Tout avec le rappel n'est pas asynchrone.Utilisez des promesses .
Cela supprime chaque collection, l'impression «abandonnée» après chacune d'elles, puis imprime «tout abandonné» une fois terminé. Si une erreur se produit, elle s'affiche sous
stderr
.Réponse précédente (ceci est antérieur au support natif de Node pour Promises):
Utilisez les promesses Q ou les promesses Bluebird .
Avec Q :
Avec Bluebird :
la source
require('bluebird')
.promisifyAll
fonctionnalité.function abc(data){
, parce que ce n'est pas commefunction abc(err, callback){...
Fondamentalement, je ne pense pas que toutes les fonctions prennent l'erreur comme premier paramètre et le rappel comme 2ème paramètre.map(function(name) { return conn.collection(name).drop() })
La façon de le faire est de transmettre aux tâches un rappel qui met à jour un compteur partagé. Lorsque le compteur partagé atteint zéro, vous savez que toutes les tâches sont terminées afin que vous puissiez continuer votre flux normal.
Bien sûr, il existe de nombreuses façons de rendre ce type de code plus générique ou réutilisable et n'importe laquelle des nombreuses bibliothèques de programmation asynchrone devrait avoir au moins une fonction pour faire ce genre de chose.
la source
En développant la réponse @freakish, async propose également une méthode à chaque, qui semble particulièrement adaptée à votre cas:
À mon humble avis, cela rend le code à la fois plus efficace et plus lisible. J'ai pris la liberté de supprimer le
console.log('dropped')
- si vous le souhaitez, utilisez ceci à la place:la source
Je fais cela sans bibliothèques externes:
la source
Toutes les réponses sont assez anciennes. Depuis le début de 2013, Mongoose a commencé à prendre en charge les promesses progressivement pour toutes les requêtes, ce serait donc la manière recommandée de structurer plusieurs appels asynchrones dans l'ordre requis à l'avenir, je suppose.
la source
Avec
deferred
(une autre promesse / mise en œuvre différée), vous pouvez faire:la source
Si vous utilisez Babel ou de tels transpilers et utilisez async / await, vous pouvez faire:
la source
drop()
et vous attendre à renvoyer une promesse. Pouvez-vous s'il vous plaît corriger cet exemple et supprimeronDrop
?