Einige Sprachen bieten ein spezielles Sprachkonstrukt, um dieses Problem zu lösen. Zum Beispiel hat C# async
/await
Schlüsselwörter, mit denen Sie den Code so schreiben können, als würden Sie synchrone APIs aufrufen.
JavaScript nicht und Sie müssen den createAccount
verketten Anrufe mit Rückruf.
Einige Leute haben Bibliotheken entwickelt, die Ihnen helfen können, diesen Code zu organisieren. Zum Beispiel async , Schritt , node-promise und Q
Sie können auch die Fasern verwenden Bibliothek, eine native Bibliothek, die die JavaScript-Laufzeit um Fibers / Coroutinen erweitert.
Und einige Leute haben die Sprache um Konstrukte erweitert, die async
ähneln /await
:streamline.js
, IcedCoffeeScript
oder wind.js
. Zum Beispiel verwendet streamline.js (ich bin der Autor, also bin ich offensichtlich voreingenommen) _
als speziellen Callback-Platzhalter und lässt Sie Ihr Beispiel schreiben als:
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.")
}
}
Und nicht zuletzt neue Sprachfeatures wie Generatoren und verzögerte Funktionen werden für zukünftige Versionen von JavaScript diskutiert (Generatoren landen sehr wahrscheinlich in ES6, zurückgestellte Funktionen scheinen etwas ins Stocken geraten zu sein).
Sie haben also viele Möglichkeiten:
- Halten Sie sich an Rückrufe
- eine Hilfsbibliothek verwenden
- verwenden Sie die Fibres-Laufzeiterweiterung
- Verwenden Sie eine Spracherweiterung
- warte auf ES6