sql >> Databáze >  >> NoSQL >> MongoDB

Jak obejít tento asynchronní problém MongoDB/Node?

Některé jazyky poskytují speciální jazykovou konstrukci pro řešení tohoto problému. Například C# má async /await klíčová slova, která vám umožní psát kód, jako byste volali synchronní API.

JavaScript ne a musíte zřetězit createAccount volání se zpětným voláním.

Někteří lidé vyvinuli knihovny, které vám mohou pomoci uspořádat tento kód. Například async , krok , node-promise a Q

Můžete také použít vlákna library, nativní knihovna, která rozšiřuje běh JavaScriptu o vlákna / korutiny.

A někteří lidé rozšířili jazyk o konstrukce, které jsou podobné async /await :streamline.js , IcedCoffeeScript nebo wind.js . Například streamline.js (jsem autor, takže jsem zjevně zaujatý) používá _ jako speciální zástupný symbol zpětného volání a umožňuje vám napsat příklad jako:

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.")
    }
}

A v neposlední řadě nové jazykové funkce, jako jsou generátory a odložené funkce jsou diskutovány pro budoucí verze JavaScriptu (generátory velmi pravděpodobně přistanou v ES6, odložené funkce se zdají být trochu zablokované).

Máte tedy mnoho možností:

  • držte se zpětných volání
  • použijte pomocnou knihovnu
  • použijte rozšíření běhového prostředí vláken
  • použijte jazykové rozšíření
  • počkej na ES6


  1. Únik paměti v MongoDB kurzoru (OutOfMemory)?

  2. Platnost dat Mongoose vyprší, ale uchovávejte je v databázi

  3. Nejjednodušší způsob, jak nakonfigurovat Embedded MongoDB

  4. Jak spustit Redis v Azure?