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などの既存のライブラリでどのように機能しますか。
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
を実装できます。
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ドキュメント を確認してください。