2016-02-12 78 views
3

我正在使用快遞節點,並希望使用co/yield patter來爭奪我的異步回調。如何使用快遞公司?

當前的代碼看起來是這樣的:

web.post('/request/path', function(req, res, next) { 
    co(function *() { 
     let body = req.body 
     let account = yield db.get('account', {key: body.account}) 
     if (!account) { 
      throw new Error('Cannot find account') 
     } 
     let host = yield db.get('host', {key: body.hostname}) 
     .... 

    }).catch(err => {log.info(err) ; res.send({error: err})}) 

這是工作非常好,但我希望能夠簡化前兩行:

web.post('/request/path', function(req, res, next) { 
    co(function *() { 

是否有可能以某種方式將co(函數*()集成到第一行?express是否提供對co()和yielding函數的支持?

回答

4

您可以使用co-express以及promises。

例,

router.get('/', wrap(function* (req, res, next) { 
    var val; 

    try { 
     val = yield aPromise(); 
    } catch (e) { 
     return next(e); 
    } 

    res.send(val); 
})); 
1

您可以用箭頭功能簡化的語法:

web.post('/request/path', (req, res, next) => co(function *() { 
     //... 
}).catch(err => {log.info(err) ; res.send({error: err})}) 

我看不出有任何額外的好處是用另一個包。當異步/等待上架時,我們可能會看到明確的更新。

在一個側面說明,使自己的共表達很簡單:

考慮 '共表達/ index.js'

module.exports = generator => (req, res, next) => require('co').wrap(generator)(req, res, next).catch(err => res.status(500).send(err)); 

現在:

var coe = require('./co-express'); 
web.post('/request/path', coe(function *(req, res, next) { 
    //... 
}) 

這樣你就有了最新的co包。