Algumas linguagens fornecem uma construção de linguagem especial para lidar com esse problema. Por exemplo, C# tem
async
/await
palavras-chave que permitem escrever o código como se estivesse chamando APIs síncronas. JavaScript não e você tem que encadear o
createAccount
chamadas com retorno de chamada. Algumas pessoas desenvolveram bibliotecas que podem ajudá-lo a organizar esse código. Por exemplo async , passo , node-promise e Q
Você também pode usar as fibras library, uma biblioteca nativa que estende o runtime do JavaScript com fibras/corrotinas.
E algumas pessoas estenderam a linguagem com construções semelhantes a
async
/await
:streamline.js
, IcedCoffeeScript
ou wind.js
. Por exemplo, stream.js (eu sou o autor, então obviamente sou tendencioso) usa _
como um espaço reservado de retorno de chamada especial e permite que você escreva seu exemplo como: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, por último, mas não menos importante, novos recursos de linguagem, como geradores e funções adiadas estão sendo discutidos para futuras versões do JavaScript (geradores são muito propensos a pousar no ES6, funções adiadas parecem estar um pouco paradas).
Então você tem muitas opções:
- manter os retornos de chamada
- usar uma biblioteca auxiliar
- usar a extensão de tempo de execução das fibras
- usar uma extensão de idioma
- aguarde ES6