sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo solucionar este problema asíncrono de MongoDB/Node?

Algunos lenguajes proporcionan una construcción de lenguaje especial para tratar este problema. Por ejemplo, C# tiene async /await palabras clave que le permiten escribir el código como si estuviera llamando a las API síncronas.

JavaScript no lo hace y tienes que encadenar el createAccount llamadas con devolución de llamada.

Algunas personas han desarrollado bibliotecas que pueden ayudarlo a organizar este código. Por ejemplo, async , paso , node-promise y P

También puede usar las fibras library, una biblioteca nativa que amplía el tiempo de ejecución de JavaScript con fibras/corutinas.

Y algunas personas han ampliado el lenguaje con construcciones que son similares a async /await :streamline.js , IcedCoffeeScript o wind.js . Por ejemplo, streamline.js (soy el autor, así que obviamente soy parcial) usa _ como un marcador de posición de devolución de llamada especial y le permite escribir su ejemplo 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.")
    }
}

Y, por último, pero no menos importante, nuevas funciones de lenguaje como generadores y funciones diferidas se están discutiendo para futuras versiones de JavaScript (es muy probable que los generadores aterricen en ES6, las funciones diferidas parecen estar un poco estancadas).

Así que tienes muchas opciones:

  • apegarse a las devoluciones de llamada
  • usar una biblioteca auxiliar
  • usar la extensión de tiempo de ejecución de fibras
  • usar una extensión de idioma
  • espera a ES6