Suche…


Bemerkungen

Verheißungen haben Zustand, sie fangen wie ausstehend an und können sich niederlassen:

  • erfüllt, was bedeutet, dass die Berechnung erfolgreich abgeschlossen wurde.
  • abgelehnt bedeutet, dass die Berechnung fehlgeschlagen ist.

Versprechen, dass zurückkehrende Funktionen niemals werfen , sollten sie stattdessen Ablehnungen zurückgeben. Werfen von einem Versprechen der Rückkehr Funktion wird Sie zwingen , sowohl eine verwenden } catch { und eine .catch . Benutzer, die versprochene APIs verwenden, erwarten nicht, dass sie versprochen werden. Wenn Sie nicht sicher sind, wie async-APIs in JS funktionieren, lesen Sie bitte zuerst diese Antwort .

Ein gesamtes NodeJS-Modul auf einmal konvertieren

Angenommen, Sie haben eine Bibliothek, die Callbacks zurückgibt, beispielsweise das Modul fs in NodeJS:

const fs = require("fs");
fs.readFile("/foo.txt", (err, data) => {
  if(err) throw err;
  console.log(data);
});

Wir möchten es mit Bluebird in ein versprechendes API umwandeln - dies können wir mit promisifyAll tun, das ein gesamtes API in Versprechen umwandelt:

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);

Damit können Sie das gesamte Modul wie versprochen nutzen.

Hier sind einige allgemeine Beispiele, wie man bestimmte Module versprechen kann:

// 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"));

Konvertierung einer einzelnen NodeJS-Funktion

Sie können eine einzelne Funktion mit einem Rückrufargument mit Promise.promisify in eine Promise -returning-Version Promise.promisify .

const fs = require("fs");
fs.readFile("foo.txt", (err, data) => {
   if(err) throw err;
   console.log(data);
});

wird:

const promisify = require("bluebird");
const readFile = promisify(require("fs").readFile));
readFile("foo.txt").then(console.log); // promisified version

Konvertierung einer anderen Callback-API

Um eine Callback-API in ein Versprechen umzuwandeln, sofern die promisify und promisifyAll Version nicht passt, können Sie den Versprechungskonstruktor verwenden .

Versprechen erstellen bedeutet im Allgemeinen, festzulegen, wann sie sich abwickeln - das heißt, wenn sie in die erfüllte (abgeschlossene) oder abgelehnte (fehlerhafte) Phase wechseln, um anzuzeigen, dass die Daten verfügbar sind (und auf die dann zugegriffen werden .then ).

new Promise((fulfill, reject) => { // call fulfill/reject to mark the promise
   someCallbackFunction((data) => {
      fulfill(data); // we mark it as completed with the value
   })
});

Als Beispiel konvertieren setTimeout in Versprechungen:

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));

Wir können es jetzt wie eine reguläre Versprechenfunktion verwenden:

delay(1000).then(() => console.log("One second passed")).
            then(() => delay(1000)).
            then(() => console.log("Another second passed"));


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow