2016-05-30 2 views
1

Я разрабатываю приложение nodejs и использую bluebird.js - Promise. У меня есть метод, который я хочу вызвать после каждого метода .then(), выполняемого в цепочке. Есть ли способ (или API), который поддерживает это в bluebird.js?Выполнение общего метода после каждой функции Promise.then

Спасибо.

+0

Для 'new Promise (...). Then (...). Then (...). Then (...);', вы ожидаете, что ваш метод будет вызван 3 раза? – Martial

+0

Нет. Нет встроенного способа сделать это, и даже попытаться взломать его, исправив 'Promise.prototype.then()' было бы довольно сложно. Пожалуйста, опишите реальную проблему, которую вы пытаетесь решить, поэтому мы можем предложить поддерживаемый способ решения любой вашей реальной проблемы. – jfriend00

+0

Вы пытаетесь вызвать свой метод после вызова '.then()'? Или после того, как вызывается каждый 'resolveHandler' или' rejectHandler', который был передан в '.then()'? Это две разные вещи, так как 'resolveHandler' или' rejectHandler' вызываются долго после вызова '.then()'. – jfriend00

ответ

0

Для этого вы можете использовать API мониторинга bluebird.

Promise.config({ 
    monitoring: true 
}); 

Слушайте promiseChained событие для обнаружения then прикован, а затем слушать promiseFulfilled события, чтобы знать, когда обратный вызов выполняется:

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

Я бы создал специальный обратный вызов для каждого тогда. Например:

Допустим, у вас есть 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)); 

Fiddle here.

Смежные вопросы