return 为 Bluebird Promise 做什么?

What to return for Bluebird Promise?

新年快乐!

如果有人可以就 Bluebird's promisify 的问题给我提示,我将不胜感激。废话不多说,情况如下。我有这段代码:

/**
* Set up /website endpoint.
* @param {Object} router A Koa router
*/
module.exports = function(router) {
/**
* POST /website
*
* Records the activity of following an external
* website URL.
*/
  router.post('/website', validator, (ctx, next) => co(function * () {
    var address = forwardedFor(ctx.request, ctx.request.headers);
    var orgId = /\/?([^\-]+).*/.exec(ctx.request.body.path)[1];

    var visit = {
      websiteUrl: ctx.request.body.url,
      path: ctx.request.body.path,
      clientIp: address.ip,
      userAgent: ctx.request.headers['user-agent'],
      organization: orgId
    };
    yield tracker.track('website_visit', visit);
    log.info('Tracked [%s] website visit from client %s@%s%s', visit.websiteUrl, address.ip, orgId, visit.path);

    ctx.status = 200;
    ctx.body = {
      success: true,
      timestamp: Date.now(),
      data: visit
    };
    return next();
  })());
};

在某个时候调用:

/**
* Register the `event` with the given `name`.
* @method track
* @param  {String} name  The name or type of the event to be saved.
* @param  {Object} event Payload to register as an event.
* @return {Promise}       A promise on tracking the event.
*/
function track(name, event) {
  var entity = seneca.make(DEFAULT_BASE, name, event);
  var save$ = Promise.promisify(entity.save$, { context: entity });
  return save$();
}

这最终调用:

module.exports = function phonecall() {
  var seneca = this;

  seneca.add('cmd:save,role:entity,name:website_visit', function(msg, respond) {
    var visit = JSON.parse(JSON.stringify(msg.ent.data$(false)));
    Organization.where('account_no', 'like', `%${visit.organization}%`)
      .fetch()
      .then(function(org) {
        return User
          .where('id_organization', org.get('id'))
          .fetch()
          .then(function(user) {
            delete visit.organization;
            var v = new WebsiteVisit(visit);
            user.websiteVisits().create(v);
            return user.save(null, {
              method: 'update'
            });
          });
      })
      .then((model) => {
        return {
          ok: true,
          model: model
        };
      })
      .catch((err) => {
        return {
          ok: false,
          why: err.message || err
        };
      }).asCallback(respond);
  });

  return {
    name: PLUGIN_NAME
  };
};

这是一个完全不同的应用程序。

主要问题是一切顺利,模型插入数据库。但是,yield tracker.track('website_visit', visit); 需要永远并且不会异步运行,这会为已经完成的函数启动超时错误。

yield tracker.track('website_visit', visit); 的理想行为是在不同的线程上(异步)操作,就像正常的 promise 应该的那样,但不是这样...

在此先感谢您提供的任何帮助。

yield 表达式需要显式指令才能继续执行。它旨在让您能够停止和开始执行流程。在您的情况下,这似乎不是必需的。除非我弄错了,否则您似乎只需要等待异步函数的结果,然后再继续,这只是 Promise 的标准用例。

为什么不直接使用您在 phoneCall 函数中使用的相同 Promise 架构?