2016-05-30 13 views
1

私はnodejsアプリケーションを開発し、bluebird.js - Promiseを使用しています。チェーン内で各.then()メソッドが実行された後に呼び出すメソッドがあります。 bluebird.jsでこれをサポートする方法(またはAPI)がありますか?各Promise.then関数の後に共通のメソッドを実行する

ありがとうございました。

+0

新しいプロミス(...)の場合は、(...)。then(...)。then(...); '、あなたのメソッドが3回呼び出されることを期待していますか? – Martial

+0

いいえ、それを行うための組み込みの方法はなく、 'Promise.prototype.then()'をパッチすることによってそれをハックしようとしても、かなり複雑になります。本当の問題が何であっても解決できるように、あなたが解決しようとしている実際の問題を記述してください。 – jfriend00

+0

'.then()'が呼ばれた後にあなたのメソッドを呼び出そうとしていますか?または、 '.then()'に渡された 'resolveHandler'または' rejectHandler'が呼び出された後でもかまいませんか?これらは 'resolveHandler'や' rejectHandler'が '.then()'が呼ばれてから長く呼ばれるのとはまったく異なる2つのことです。 – jfriend00

答えて

0

これにはブルーバード監視APIを使用できます。

Promise.config({ 
    monitoring: true 
}); 

thenが連鎖して、コールバックが実行された時に知っておくpromiseFulfilledイベントに耳を傾けている検出するpromiseChainedイベントに聞く:

var candidates = new WeakSet(); // a set for our promises that were chained 
process.on('promiseChained', (_, {promise, child}) => { 
    candidates.add(child); 
}); 
process.on('promiseFullfilled', (_, {promise}) => { 
    if(candidates.has(promise)) { 
     callYourFunctionHere(); // HERE 
    } 
}); 

これが実行すべてのthenハンドラで実行されますもしpromise(引数)がそれに連鎖しているのか、それともそれがそれであるのかを確認してから、の具体的なのためにそれを実行したいのであれば、候補に追加する前に - セットの中で(それはチェーンの一部です)。

0

私はそれぞれに特別なコールバックを作成したいと思います。例:

"then"で使用する3種類のコールバックがあるとします。

function callbackA() { 
    console.log('A'); 
    return Promise.resolve(); 
} 
function callbackB(hello) { 
    console.log('B',hello); 
    return Promise.resolve(); 
} 
function callbackC() { 
    console.log('C'); 
    return Promise.resolve(); 
} 

//Then you have your "then" handler: 

function handler(cb, context, params) { 
    context = context || this; 
    params = params || []; 
    //Do your "on-every-then stuff 
    console.log("It's a THEN!!!"); 
    //Then run your desired callback 
    return cb.apply(context, params); 
} 

//And your main code: 
callbackA() 
    .then(handler(callbackB, this, ["there"])) 
    .then(handler(callbackC)); 

フィドルhere