Alcuni linguaggi forniscono un costrutto linguistico speciale per affrontare questo problema. Ad esempio, C# ha async
/await
parole chiave che ti consentono di scrivere il codice come se stessi chiamando API sincrone.
JavaScript non lo fa e devi concatenare createAccount
chiamate con richiamata.
Alcune persone hanno sviluppato librerie che potrebbero aiutarti a organizzare questo codice. Ad esempio async , passaggio , node-promise e D
Puoi anche utilizzare le fibre library, una libreria nativa che estende il runtime JavaScript con fibre/coroutine.
E alcune persone hanno esteso il linguaggio con costrutti simili a async
/await
:streamline.js
, IcedCoffeeScript
o wind.js
. Ad esempio, streamline.js (io sono l'autore quindi sono ovviamente di parte) usa _
come segnaposto di callback speciale e ti consente di scrivere il tuo esempio come:
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.")
}
}
E, ultimo ma non meno importante, nuove funzionalità linguistiche come generatori e funzioni differite sono in discussione per le future versioni di JavaScript (è molto probabile che i generatori atterrino in ES6, le funzioni differite sembrano essere un po' bloccate).
Quindi hai molte opzioni:
- Attenersi alle richiamate
- usa una libreria di supporto
- usa l'estensione di runtime delle fibre
- utilizza un'estensione di lingua
- aspetta ES6