bluebird
コールバックAPIを約束に変換する。
サーチ…
備考
約束は状態を持っている、彼らは保留として開始し、決めることができます:
- 計算が正常に完了したことを意味します。
- これは計算が失敗したことを意味します。
プロミスの返す関数は投げられるべきではなく 、拒絶を返すべきです。約束関数を返すことから.catch と 、 } catch { と .catch両方を使うよう強制されます。約束されたAPIを使用している人は、約束を放棄するとは考えていません。 JSで非同期APIがどのように機能するかわからない場合は、まずこの回答をご覧ください 。
一度にNodeJSモジュール全体を変換する
たとえば、NodeJSのfsモジュールのように、コールバックを返すライブラリがあるとします。
const fs = require("fs");
fs.readFile("/foo.txt", (err, data) => {
if(err) throw err;
console.log(data);
});
私たちは、それを約束を使うためにAPI全体を変換するpromisifyAllを使って、これを行うことができます。
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);
これにより、モジュール全体を約束として使用できます。
特定のモジュールを約束する方法に関するいくつかの一般的な例を以下に示します。
// 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"));
単一のNodeJS関数の変換
あなたは、コールバックに引数を持つ単一の関数に変換することができますPromiseと-returningバージョンPromise.promisifyので、この:
const fs = require("fs");
fs.readFile("foo.txt", (err, data) => {
if(err) throw err;
console.log(data);
});
次のようになる:
const promisify = require("bluebird");
const readFile = promisify(require("fs").readFile));
readFile("foo.txt").then(console.log); // promisified version
他のコールバックAPIの変換
promisifyとpromisifyAllバージョンが合わないと仮定して、任意のコールバックAPIを約束に変換するには、 約束コンストラクタを使用できます。
約束を作成するとは、一般に、決済時期を指定することです。つまり、履行完了(完了)または拒否(エラー)段階に移行し、データが利用可能であることを示します(また、 .thenでアクセス可能)。
new Promise((fulfill, reject) => { // call fulfill/reject to mark the promise
someCallbackFunction((data) => {
fulfill(data); // we mark it as completed with the value
})
});
例として、 setTimeoutを約束を使用するように変換しましょう:
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));
通常の約束関数を返すように使用できます:
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
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow