MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como contornar esse problema assíncrono do MongoDB/Node?


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