2017-01-02 39 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