web-dev-qa-db-ja.com

promisifyAllはどのように機能しますか、またはそれが機能するための要件は何ですか?

Promiseライブラリでは、bluebirdには、コールバックパターンを持つ非同期関数をpromiseベースのieに変換すると主張する関数promisifyAllまたは他の同様のライブラリがあります。 resolve()reject()、またはdone() ..では、どのように機能しますか?

例えば:

function myAsync1 (data, url, callBack) {...}

そして私がそれを入れたら

Promise.promisify(myAsycn1);

その後、私の関数はこのように機能します。

myAsync1('{..}', 'http://..').then(function(){...});

これは私を悩ませてきました。 Bluebird promisifyAllがそれらをpromiseベースのメソッドに変換するために、非同期の非promiseライブラリまたは関数が従う必要のあるパターンがありますか、またはそれらを変換する魔法があります。

そうでない場合、要件は何であり、mongodbなどの既存のライブラリでどのように機能しますか。

14
Muhammad Umer

BluebirdpromisifyAllがそれらをpromiseベースのメソッドに変換するために非同期の非promiseライブラリまたは関数が従う必要があるパターンはありますか

はい、パターンがあります。変換する関数は、最後の引数としてコールバックを期待する必要があります。さらに、コールバックの最初の引数としてエラーを渡し(エラーがない場合はnull)、2番目の引数として戻り値を渡す必要があります。

BlueBird promisify関数は、最適化のために追跡するのが非常に難しいため、簡単な記述方法を示します。

function promisify(fn) {
  return function() {
    var that = this; // save context
    var args = slice.call(arguments); // turn into real array
    return new Promise(function(resolve, reject) {
      var callback = function(err, ret) { // here we assume the arguments to
                                          // the callback follow node.js
                                          // conventions
        if(err != undefined) {
          reject(err);
        } else {
          resolve(ret);
        }
      };
      fn.apply(that, args.concat([callback])); // Now assume that the last argument will
                                              // be used as a callback
    });
  };
}

これで、ターゲットオブジェクトの関数をループし、それぞれにpromisifyAllを使用することで、promisifyを実装できます。

22
Aaron Dufour

promisifyAll()メソッドは、パラメーターとして呼び出されているモジュールまたはオブジェクト全体を約束します。つまり、オブジェクトの各プロパティのコピーはAsyncサフィックスで作成されます。これは、実際には同じメソッドの有望なバージョンです。つまり、.then()または.done()メソッド。

たとえば、someModuleモジュールにdoSomething()メソッドがある場合、Promise.promisifyAll(someModule)を呼び出した後、doSomethingAsync()というモジュールに新しいメソッドが作成されます。 。次のように使用できます。

var someModule = require('some-module');
Promise.promisifyAll(someModule);
someModule.doSomethingAsync().then(function(result) {
    // do whatever you want with result, this function runs after doSomthingAsync() 
    // is finished and the returned value is stored in 'result' variable.
});

詳細については、 bluebird APIドキュメント を確認してください。

3
Lior Erez