尝试将promises集成到我的seneca模块中。
首先,我们有一个公开路由的server.js文件:
var express = require('express');
var app = express();
var Promise = require('bluebird');
var seneca = require('seneca')();
var act = Promise.promisify(seneca.act, {context: seneca});
var payroll = require ('./app/payroll');
seneca.use(payroll);
var router = express.Router();
router.route('/')
.get(function(req, res) {
act({role:'payroll', cmd:'generate-weekly-report-data', wc: 1489363200})
.then(function (data) {
res.json(data)
})
.catch(function (err) {
res.send(err)
});
})
app.use('/payroll', router);
app.listen(3000);
console.log("Magic happens at port 3000");
然后我们获得了工资单模块(payroll.js),其中包含一些会计功能的开头:
module.exports = function(options) {
var Promise = require('bluebird');
var seneca = this;
var act = Promise.promisify(seneca.act, {context: seneca});
var payStructure = require ('../plugins/pay-structure');
seneca.use(payStructure);
seneca.add({role:'payroll', cmd:'generate-weekly-report-data'}, function (args, done) {
act({role:'pay-structure', cmd:'get'})
.then(function (pay_structure) {
var referralPayRate = pay_structure.referralPayRate
var stylistPayRate = pay_structure.stylistPayRate
done( null, act({role:'transactions', cmd:'get_week', wc: args.wc, condense: true, totals: true }) )
})
.catch(function (err) {
done(err)
});
});
}
任何帮助表示赞赏。
答案 0 :(得分:0)
为什么一发帖后一切都有意义? -_- ''
解答:
问题是我通过完成回调函数返回一个承诺,这个函数不期望一个承诺,它只是想要一些JSON数据。
相反,我需要添加一个额外的链来从promise中获取结果,然后将json传递给done。
所以不是:
act({role:'pay-structure', cmd:'get'})
.then(function (pay_structure) {
var referralPayRate = pay_structure.referralPayRate
var stylistPayRate = pay_structure.stylistPayRate
done( null, act({role:'transactions', cmd:'get_week', wc: args.wc, condense: true, totals: true }) )
})
.catch(function (err) {
done(err)
});
但是对:
act({role:'pay-structure', cmd:'get'})
.then(function (result) {
pay_structure = result
return act({role:'transactions', cmd:'get_week', wc: args.wc, condense: true, totals: true })
}).then(function( transactions ) {
done(transactions)
})
.catch(function (err) {
done(err)
});