Usando la Promise
clase
Recomiendo echar un vistazo a los documentos de Promise de MDN que ofrecen un buen punto de partida para usar Promises. Alternativamente, estoy seguro de que hay muchos tutoriales disponibles en línea. :)
Nota: Los navegadores modernos ya admiten la especificación ECMAScript 6 de Promises (consulte los documentos de MDN vinculados anteriormente) y supongo que desea usar la implementación nativa, sin bibliotecas de terceros.
En cuanto a un ejemplo real ...
El principio básico funciona así:
- Tu API se llama
- Crea un nuevo objeto Promise, este objeto toma una única función como parámetro de constructor
- Su función proporcionada es llamada por la implementación subyacente y la función recibe dos funciones:
resolve
yreject
- Una vez que haga su lógica, llame a uno de estos para cumplir la Promesa o rechazarla con un error
Esto puede parecer mucho, así que aquí hay un ejemplo real.
exports.getUsers = function getUsers () {
// Return the Promise right away, unless you really need to
// do something before you create a new Promise, but usually
// this can go into the function below
return new Promise((resolve, reject) => {
// reject and resolve are functions provided by the Promise
// implementation. Call only one of them.
// Do your logic here - you can do WTF you want.:)
connection.query('SELECT * FROM Users', (err, result) => {
// PS. Fail fast! Handle errors first, then move to the
// important stuff (that's a good practice at least)
if (err) {
// Reject the Promise with an error
return reject(err)
}
// Resolve (or fulfill) the promise with data
return resolve(result)
})
})
}
// Usage:
exports.getUsers() // Returns a Promise!
.then(users => {
// Do stuff with users
})
.catch(err => {
// handle errors
})
Usando la función de lenguaje asincrónico / en espera (Node.js> = 7.6)
En Node.js 7.6, el compilador de JavaScript v8 se actualizó con soporte async / await . Ahora puede declarar funciones como siendo async
, lo que significa que devuelven automáticamente un Promise
que se resuelve cuando la función asíncrona completa la ejecución. Dentro de esta función, puede usar la await
palabra clave para esperar hasta que se resuelva otra Promesa.
Aquí hay un ejemplo:
exports.getUsers = async function getUsers() {
// We are in an async function - this will return Promise
// no matter what.
// We can interact with other functions which return a
// Promise very easily:
const result = await connection.query('select * from users')
// Interacting with callback-based APIs is a bit more
// complicated but still very easy:
const result2 = await new Promise((resolve, reject) => {
connection.query('select * from users', (err, res) => {
return void err ? reject(err) : resolve(res)
})
})
// Returning a value will cause the promise to be resolved
// with that value
return result
}