bluebird
Convertir una API de devolución de llamada a promesas.
Buscar..
Observaciones
Las promesas tienen estado, comienzan como pendientes y pueden conformarse con:
- Cumplido lo que significa que el cálculo completado con éxito.
- rechazado, lo que significa que el cálculo falló.
Las funciones de devolución de promesas nunca deben lanzarse , sino que deben devolver rechazos. Lanzar desde una función de devolución de promesa lo forzará a usar tanto } catch { como a .catch . Las personas que utilizan API prometidas no esperan que las promesas se cumplan. Si no está seguro de cómo funcionan las API asíncronas en JS, consulte esta respuesta primero.
Convertir todo un módulo NodeJS a la vez.
Digamos que tiene una biblioteca que devuelve devoluciones de llamada, por ejemplo, el módulo fs en NodeJS:
const fs = require("fs");
fs.readFile("/foo.txt", (err, data) => {
if(err) throw err;
console.log(data);
});
Queremos convertirlo en una API de devolución de promesa, con bluebird. Podemos hacerlo usando promisifyAll que convierte una API completa para usar promesas:
const Promise = require("bluebird");
const fs = Promise.promisifyAll(require("fs"));
// this automatically adds `Async` postfixed methods to `fs`.
fs.readFileAsync("/foo.txt").then(console.log);
Lo que te permite usar todo el módulo como promesas.
Aquí hay algunos ejemplos comunes sobre cómo promisificar ciertos módulos:
// The most popular redis module
var Promise = require("bluebird");
Promise.promisifyAll(require("redis"));
// The most popular mongodb module
var Promise = require("bluebird");
Promise.promisifyAll(require("mongodb"));
// The most popular mysql module
var Promise = require("bluebird");
// Note that the library's classes are not properties of the main export
// so we require and promisifyAll them manually
Promise.promisifyAll(require("mysql/lib/Connection").prototype);
Promise.promisifyAll(require("mysql/lib/Pool").prototype);
// Mongoose
var Promise = require("bluebird");
Promise.promisifyAll(require("mongoose"));
// Request
var Promise = require("bluebird");
Promise.promisifyAll(require("request"));
// Use request.getAsync(...) not request(..), it will not return a promise
// mkdir
var Promise = require("bluebird");
Promise.promisifyAll(require("mkdirp"));
// Use mkdirp.mkdirpAsync not mkdirp(..), it will not return a promise
// winston
var Promise = require("bluebird");
Promise.promisifyAll(require("winston"));
// rimraf
var Promise = require("bluebird");
// The module isn't promisified but the function returned is
var rimrafAsync = Promise.promisify(require("rimraf"));
// xml2js
var Promise = require("bluebird");
Promise.promisifyAll(require("xml2js"));
// jsdom
var Promise = require("bluebird");
Promise.promisifyAll(require("jsdom"));
// fs-extra
var Promise = require("bluebird");
Promise.promisifyAll(require("fs-extra"));
// prompt
var Promise = require("bluebird");
Promise.promisifyAll(require("prompt"));
// Nodemailer
var Promise = require("bluebird");
Promise.promisifyAll(require("nodemailer"));
// ncp
var Promise = require("bluebird");
Promise.promisifyAll(require("ncp"));
// pg
var Promise = require("bluebird");
Promise.promisifyAll(require("pg"));
Convertir una sola función NodeJS
Puede convertir una sola función con un argumento de devolución de llamada a una versión de devolución de Promise con Promise.promisify , por lo que esto:
const fs = require("fs");
fs.readFile("foo.txt", (err, data) => {
if(err) throw err;
console.log(data);
});
se convierte en:
const promisify = require("bluebird");
const readFile = promisify(require("fs").readFile));
readFile("foo.txt").then(console.log); // promisified version
Convertir cualquier otra API de devolución de llamada
Para convertir cualquier API de devolución de llamada en promesas, asumiendo que promisify y promisifyAll versión no encaja, puede utilizar el constructor de promesa .
Crear promesas generalmente significa especificar cuándo se liquidan, es decir, cuando pasan a la fase cumplida (completada) o rechazada (con error) para indicar que los datos están disponibles (y se puede acceder a ellos con .then ).
new Promise((fulfill, reject) => { // call fulfill/reject to mark the promise
someCallbackFunction((data) => {
fulfill(data); // we mark it as completed with the value
})
});
Como ejemplo, vamos a convertir setTimeout para usar promesas:
function delay(ms) { // our delay function that resolves after ms milliseconds
return new Promise((resolve, reject) => { // return a new promise
setTimeout(resolve, ms); // resolve it after `ms` milliseconds have passed
})
}
// or more concisely:
const delay = ms => new Promise(r => setTimeout(r, ms));
Ahora podemos usarlo como una función de devolución de promesa regular:
delay(1000).then(() => console.log("One second passed")).
then(() => delay(1000)).
then(() => console.log("Another second passed"));