async/await
を使用するライブラリを構築しています。fs
のようなネイティブモジュールをasync/await
で使用できるかどうかを知りたいです。 async/await
はバックグラウンドでの単なるPromiseであることを知っているので、メソッドまたは関数を約束するネイティブな方法はありますか?現在Bluebirdを使用していますが、それが悪いパターンかどうかはわかりません。
例:
const Bluebird = require("bluebird");
const { access } = require("fs");
const accessAsync = Bluebird.promisify(access);
async function checkInput(options) {
await accessAsync(options.file);
/// etc
return options;
}
module.exports = (options) => {
Promise.resolve(options)
.then(checkInput)
};
私はネイティブのプロミスとブルーバードの両方を組み合わせています。 Bluebirdだけを使用すればよいですか?
私はasync/awaitを使用するライブラリを構築しています。async/ awaitでfsのようなネイティブモジュールを使用できるかどうか知りたいのですが。
はい。 Bluebirdを使用すると、例よりもさらに簡単に行うことができます。
_let fs = Promise.promisifyAll(require('fs'));
// and in async function:
let contents = await fs.readFileAsync('file.txt', 'utf-8');
_
メソッド名の最後にAsync
を追加する必要があることに注意してください。
または、メソッドにmz
を追加する必要なく、Async
モジュールを使用できます。見る:
_npm install mz
_を実行すると必要になる可能性のある多くのモジュールがあります。たとえば、require('mz/fs')
を実行すると、コールバックを取る代わりにpromiseを返すfs
モジュールバージョンをすぐに使用できます。 async awaitと組み合わせると、次のようなことができます。
_let fs = require('mz/fs');
// and in async function:
let contents = await fs.readFile('file.txt', 'utf-8');
_
上記のコードはまだ非ブロッキングです。
mz
モジュールのcrypto
バージョンの例を示し、より詳細に説明するこの回答を参照してください。
例を参照してください:
_let crypto = require('mz/crypto');
async function x() {
let bytes = await crypto.randomBytes(4);
console.log(bytes);
}
_
以下を含む他の多くのモジュールでも同じことができます。
child_process
_crypto
dns
fs
readline
zlib
私は非同期/待機がバックグラウンドでのPromiseであることを知っているので、...メソッドまたは関数を約束するネイティブな方法はありますか?
まもなくNodeはそれをネイティブにサポートします-を参照してくださいPR#5020プロミスのコアサポートの追加:
その間、mz
を使用できます。
詳細については、問題も参照してください。#7549 v1:コールバックなしで非同期関数を実行するとpromisesが返されます。
ノードのPromisesワーキンググループリポジトリも参照してください:
更新:上記のPR 5020はNodeにすぐに着陸しないようです-おかげでBenjamin Gruenbaumがコメントで指摘してくれたので、Bluebirdのpromisify
とpromisifyAll
と便利なmz
モジュールを使用するのが、 Nodeのコアモジュールを備えた言語です。幸い、それらは非常にうまく機能するため、大きな問題ではありません。
どうしても、bluebirdはdesignedでネイティブプロミスを処理します。あなたが説明するユースケースはサポートされているだけでなく、Bluebirdの設計目標でもあります。
Bluebirdのpromiseは、Promises/A +仕様に従ってthen
を実装します。これは、await
での動作が保証されています。さらに、ネイティブの約束をbluebirdに渡すことができ、それは問題なく動作します。
BluebirdとPromisesを使用しても、頭が上がるだけです。ブルーバードは他の約束を処理するのに十分であることを意味します。
ありがとう