bluebird
Convertir une API de rappel en promesses.
Recherche…
Remarques
Les promesses ont l'état, elles commencent comme en attente et peuvent se contenter de:
- rempli ce qui signifie que le calcul s'est terminé avec succès.
- rejetée signifiant que le calcul a échoué.
Les fonctions de retour prometteuses ne devraient jamais être lancées , elles devraient plutôt renvoyer les rejets. Lancer à partir d'une promesse retournant la fonction vous obligera à utiliser à la fois un } catch { et un .catch . Les personnes utilisant des API promis n'attendent pas de promesses. Si vous ne savez pas comment les API asynchrones fonctionnent dans JS, consultez d'abord cette réponse .
Conversion d'un module NodeJS complet à la fois
Disons que vous avez une bibliothèque qui renvoie des rappels, par exemple le module fs dans NodeJS:
const fs = require("fs");
fs.readFile("/foo.txt", (err, data) => {
if(err) throw err;
console.log(data);
});
Nous voulons le convertir en une API de retour prometteuse, avec bluebird - nous pouvons le faire en utilisant promisifyAll qui convertit une API entière pour utiliser des promesses:
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);
Ce qui vous permet d'utiliser tout le module comme des promesses.
Voici quelques exemples courants sur la façon de promouvoir certains modules:
// 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"));
Conversion d'une seule fonction NodeJS
Vous pouvez convertir une fonction unique avec un argument de rappel en une version de retour Promise avec Promise.promisify , afin que:
const fs = require("fs");
fs.readFile("foo.txt", (err, data) => {
if(err) throw err;
console.log(data);
});
devient:
const promisify = require("bluebird");
const readFile = promisify(require("fs").readFile));
readFile("foo.txt").then(console.log); // promisified version
Conversion de toute autre API de rappel
Afin de convertir n'importe quelle API de rappel en promesses en supposant que la version promisify et promisifyAll ne correspond pas - vous pouvez utiliser le constructeur prometteur .
Créer des promesses signifie généralement spécifier quand elles se règlent - cela signifie que lorsqu'elles passent à la phase remplie (complétée) ou rejetée (erronée) pour indiquer que les données sont disponibles (et peuvent être accessibles avec .then ).
new Promise((fulfill, reject) => { // call fulfill/reject to mark the promise
someCallbackFunction((data) => {
fulfill(data); // we mark it as completed with the value
})
});
Par exemple, convertissons setTimeout pour utiliser des promesses:
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));
Nous pouvons maintenant l'utiliser comme une fonction régulière de retour de promesse:
delay(1000).then(() => console.log("One second passed")).
then(() => delay(1000)).
then(() => console.log("Another second passed"));