Скажем, в модуле node.js, moduleA.js
, у меня есть следующий объект с набором асинхронных функций в стиле узла:
// moduleA.js
var init = function (data, callback) {
return callback(null, data.params );
};
var delay = function(data, callback) {
setTimeout(function(){
callback(null, data);
}, 1000*3);
}
var reverse = function(data, callback) {
var j,
d = {};
for(j in data) {
d[ data[j] ] = j;
}
callback(null, d);
}
module.exports = {
init: init,
delay: delay,
reverse: reverse
};
Я потребляю moduleA.js
в main.js
и могу успешно promisify
использовать каждый метод по отдельности, например:
// main.js
var Promise = require('bluebird'),
modA = require('./moduleA') );
var data = {
"a": "one",
"b": "two",
"c": "three",
"d": "four"
};
Promise.promisify(modA.init)(data)
.then( Promise.promisify(modA.delay) )
.then( Promise.promisify(modA.reverse) )
.then(function(data){
res.send(data);
}).catch(function(e){
next(e);
});
Приведенный выше код работает отлично, но он более подробный, чем хотелось бы.
Мой вопрос: как мне изменить свой модуль, чтобы Promise.promisifyAll
работал правильно со всем экспортируемым объектом? Я хочу избежать promisification
внутри модуля и позволить другим при желании promisify
использовать его.
Я безуспешно пробовал много вариантов следующего:
// main.js
var Promise = require('bluebird'),
modA = require('./moduleA') ),
modAPromised = Promise.promisifyAll(modA);
var data = {
"a": "one",
"b": "two",
"c": "three",
"d": "four"
};
modAPromised.initAsync(data)
.then(modAPromised.delayAsync)
.then(modAPromised.reverseAsync)
.then(function(data){
res.send(data);
}).catch(function(e){
next(e);
});
Когда я это делаю, я получаю сообщение об ошибке Cannot call method 'delay' of undefined
. Promise.promisifyAll
добавляет все функции Async
, как и ожидалось:
// console.log(modAPromised);
{
init: [Function],
delay: [Function],
reverse: [Function],
initAsync: {
[Function] __isPromisified__: true
},
delayAsync: {
[Function] __isPromisified__: true
},
reverseAsync: {
[Function] __isPromisified__: true
}
}
но мне кажется, что-то не так с контекстом. Похоже, что внутри delayAsync
пытается вызвать this.delay
, но this
не определено.
Итак, как мне изменить свой модуль, чтобы Promise.promisifyAll
работал правильно со всем экспортируемым объектом?
Заранее спасибо.
.nodeify
? Потребителю было бы еще проще - person Esailija   schedule 03.02.2015