0

试图将 Promise 集成到我的 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)
      });
  });

}

任何帮助表示赞赏。

4

1 回答 1

0

为什么你一发帖就觉得一切都有意义?-_-''

回答:

问题是我通过我完成的回调返回一个不期望承诺的函数的承诺,它只需要一些 JSON 数据。

相反,我需要添加一个额外的链来从 promise 中获取结果,然后通过 done 传递 json。

所以不是:

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)
  });
于 2017-03-15T18:48:08.830 回答