web-dev-qa-db-ja.com

async / await + Bluebirdを使用してすべてを約束する

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だけを使用すればよいですか?

8
user5487299

私は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のpromisifypromisifyAllと便利なmzモジュールを使用するのが、 Nodeのコアモジュールを備えた言語です。幸い、それらは非常にうまく機能するため、大きな問題ではありません。

7
rsp

どうしても、bluebirdはdesignedでネイティブプロミスを処理します。あなたが説明するユースケースはサポートされているだけでなく、Bluebirdの設計目標でもあります。

Bluebirdのpromiseは、Promises/A +仕様に従ってthenを実装します。これは、awaitでの動作が保証されています。さらに、ネイティブの約束をbluebirdに渡すことができ、それは問題なく動作します。

2

BluebirdとPromisesを使用しても、頭が上がるだけです。ブルーバードは他の約束を処理するのに十分であることを意味します。

ありがとう

2
Amulya Kashyap