Да кажем, че в модул 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