2017-01-02 37 views
0

新年快乐!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 %[email protected]%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);理想的行为将是在不同的线程(异步)提前提供任何帮助工作,作为一个正常的承诺应该,但不作为等...

感谢。

+0

Promise不会将同步代码转换为异步代码,如果这就是您的想法。 – Tomalak

+0

我知道,承诺不转码成异步之一,但效仿从而有可能为代码保持运行在等待承诺履行所述行为。 – abullrich

+1

如果你想想看,这是同样的事情*“转码成一个异步一个” *。承诺没有效仿。它们是对异步性的抽象,它们不会产生异步性。这必须在前面,以一些代码的形式显式运行在不同的线程上,并在完成时调用回调函数。如果你的代码需要一段时间并且运行在同一个线程上,那么承诺不会改变这个事实。 – Tomalak

回答

0

yield表达式需要明确的指令才能继续执行。它的目的是让您能够停止并开始执行流程。在你的情况下,这似乎并不需要。除非我记错了,它看起来像所有你需要的是等待异步函数的结果,然后再继续这仅仅是标准的用例的承诺。

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

+0

好了,原来的代码是由另一个程序员,谁我想在接触与做(我问自己同样的问题)。但我会毫不犹豫地试一试。谢谢! – abullrich