如果有人能給我提示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);
理想的行爲將是在不同的線程(異步)提前提供任何幫助工作,作爲一個正常的承諾應該,但不作爲等...
感謝。
Promise不會將同步代碼轉換爲異步代碼,如果這就是您的想法。 – Tomalak
我知道,承諾不轉碼成異步之一,但效仿從而有可能爲代碼保持運行在等待承諾履行所述行爲。 – abullrich
如果你想想看,這是同樣的事情*「轉碼成一個異步一個」 *。承諾沒有效仿。它們是對異步性的抽象,它們不會產生異步性。這必須在前面,以一些代碼的形式顯式運行在不同的線程上,並在完成時調用回調函數。如果你的代碼需要一段時間並且運行在同一個線程上,那麼承諾不會改變這個事實。 – Tomalak