Sommige talen bieden een speciale taalconstructie om dit probleem op te lossen. C# heeft bijvoorbeeld async
/await
trefwoorden waarmee u de code kunt schrijven alsof u synchrone API's aanroept.
JavaScript doet dat niet en u moet de createAccount
. koppelen bellen met terugbellen.
Sommige mensen hebben bibliotheken ontwikkeld die u kunnen helpen bij het organiseren van deze code. Bijvoorbeeld async , stap , node-promise en Q
U kunt ook de vezels gebruiken bibliotheek, een native bibliotheek die de JavaScript-runtime uitbreidt met vezels / coroutines.
En sommige mensen hebben de taal uitgebreid met constructies die vergelijkbaar zijn met async
/await
:streamline.js
, IcedCoffeeScript
of wind.js
. Streamline.js (ik ben de auteur, dus ik ben duidelijk bevooroordeeld) gebruikt bijvoorbeeld _
als een speciale callback placeholder en laat u uw voorbeeld schrijven 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.")
}
}
En, last but not least, nieuwe taalfuncties zoals generatoren en uitgestelde functies worden besproken voor toekomstige versies van JavaScript (generatoren zullen zeer waarschijnlijk in ES6 terechtkomen, uitgestelde functies lijken een beetje vastgelopen).
Je hebt dus veel opties:
- blijf bij terugbellen
- gebruik een helperbibliotheek
- gebruik de fiber runtime-extensie
- gebruik een taalextensie
- wacht op ES6