Vissa språk tillhandahåller en speciell språkkonstruktion för att hantera detta problem. Till exempel har C# async
/await
nyckelord som låter dig skriva koden som om du anropade synkrona API:er.
JavaScript gör det inte och du måste kedja createAccount
samtal med återuppringningar.
Vissa personer har utvecklat bibliotek som kan hjälpa dig att organisera den här koden. Till exempel async , steg , node-löfte och Q
Du kan också använda fibrerna library, ett inbyggt bibliotek som utökar JavaScript-körtiden med fibrer/koroutiner.
Och vissa människor har utökat språket med konstruktioner som liknar async
/await
:streamline.js
, IcedCoffeeScript
eller wind.js
. Till exempel, streamline.js (jag är författaren så jag är uppenbarligen partisk) använder _
som en speciell platshållare för återuppringning och låter dig skriva ditt exempel som:
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.")
}
}
Och sist men inte minst, nya språkfunktioner som generatorer och uppskjutna funktioner diskuteras för framtida versioner av JavaScript (generatorer kommer med stor sannolikhet att landa i ES6, fördröjda funktioner verkar vara lite avstannade).
Så du har många alternativ:
- håll dig till återuppringningar
- använd ett hjälpbibliotek
- använd fiberns runtime-tillägg
- använd ett språktillägg
- vänta på ES6