Je vais jouer le rôle du nécromancien ici, car je vois encore un autre moyen, meilleur, de le faire.
Utilisation de la bibliothèque des promesses merveilleuses Oiseau bleu et son promisifyAll()
méthode :
var Promise = require('bluebird');
var mongoose = require('mongoose');
Promise.promisifyAll(mongoose); // key part - promisification
var users, articles; // load mongoose models "users" and "articles" here
Promise.props({
users: users.find().execAsync(),
articles: articles.find().execAsync()
})
.then(function(results) {
res.render('profile/profile', results);
})
.catch(function(err) {
res.send(500); // oops - we're even handling errors!
});
Les principaux éléments sont les suivants :
Promise.promisifyAll(mongoose);
Rend toutes les méthodes de mongoose (et de ses modèles) disponibles en tant que fonctions retournant des promesses, avec Async
suffixe ( .exec()
devient .execAsync()
et ainsi de suite). .promisifyAll()
est presque universelle dans le monde Node.JS - vous pouvez l'utiliser sur tout ce qui fournit des fonctions asynchrones prenant un callback comme dernier argument.
Promise.props({
users: users.find().execAsync(),
articles: articles.find().execAsync()
})
.props()
La méthode bluebird prend un objet avec des promesses comme propriétés, et renvoie une promesse collective qui est résolue lorsque les deux requêtes de base de données (ici - promesses) renvoient leurs résultats. La valeur résolue est notre results
dans la fonction finale :
-
results.users
- utilisateurs trouvés dans la base de données par la mangouste
-
results.articles
- articles trouvés dans la base de données par la mangouste (d'uh)
Comme vous pouvez le constater, nous ne nous approchons même pas de l'enfer du rappel de l'indentation. Les deux requêtes de la base de données sont exécutées en parallèle - pas besoin pour l'une d'entre elles d'attendre l'autre. Le code est court et lisible - il correspond pratiquement en longueur et en complexité (ou plutôt en absence de complexité) à l'"exemple non fonctionnel" affiché dans la question elle-même.
Les promesses sont cool. Utilisez-les.