MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come aggirare questo problema asincrono MongoDB/Node?

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