Certains langages fournissent une construction de langage spéciale pour traiter ce problème. Par exemple, C# a async
/await
des mots-clés qui vous permettent d'écrire le code comme si vous appeliez des API synchrones.
JavaScript ne fonctionne pas et vous devez enchaîner le createAccount
appels avec rappels.
Certaines personnes ont développé des bibliothèques qui peuvent vous aider à organiser ce code. Par exemple async , étape , node-promise et Q
Vous pouvez également utiliser les fibres library, une bibliothèque native qui étend le runtime JavaScript avec des fibres/coroutines.
Et certaines personnes ont étendu le langage avec des constructions similaires à async
/await
:streamline.js
, IcedCoffeeScript
ou wind.js
. Par exemple, streamer.js (je suis l'auteur donc je suis évidemment biaisé) utilise _
comme espace réservé de rappel spécial et vous permet d'écrire votre exemple comme :
var db = MongoClient.connect("mongodb://localhost:27017/bq", _):
var accounts = db.createCollection('accounts', _);
createAccount("bob","bob", _);
createAccount("bob","bob", _);
createAccount("bob","bob", _);
createAccount("bob","bob", _);
function createAccount(email, password, _) {
var item = accounts.findOne({"email":email}, _);
if (item === null) {
accounts.insert({"email":email, "password":password}, _);
console.log("Account " + email + " created."); }
} else {
console.log("Account already exists.")
}
}
Et, enfin et surtout, de nouvelles fonctionnalités de langage telles que les générateurs et fonctions différées sont en cours de discussion pour les futures versions de JavaScript (les générateurs sont très susceptibles d'atterrir dans ES6, les fonctions différées semblent un peu bloquées).
Vous avez donc plusieurs options :
- s'en tenir aux rappels
- utiliser une bibliothèque d'assistance
- utiliser l'extension d'exécution des fibres
- utiliser une extension de langue
- attendre ES6