将带有callback的常规node.js函数转换为生成器和yield

我是koa.js的新手,非常喜欢它,并且开始了一个项目。 我需要使用twilio发送短信。

大多数要求twilio包裹遵循这个结构。

public.get('/najam', function *(){ this.body = "hello from najam"; //yeild before c.sendSms or inside callback? c.sendSms({ to:'YOUR_PHONE', }, function(e, m) { if (!e) { //yeild here? } }); }); 

我怎么修改它把它放在发电机function,在什么时候我会使用yield关键字?

如果你的答案build议使用Co库,请给我提供代码和位解释的例子。

只要用Promise包装基于callback的接口,就可以在路由中产生它。

 function sendSms(toPhone, textMessage) { return new Promise(function(resolve, reject) { c.sendSms({ to: toPhone, message: textMessage }, function(err, result) { if (err) return reject(err); resolve(result); }); }); } 

现在,您可以在路线内放弃它。 如果它抛出一个错误(就像networkingclosures),然后Koa的默认error handling程序将捕获它,并将其变成500错误。

 public.get('/najam', function *(){ this.body = "hello from najam"; yield sendSms('YOUR_PHONE', 'SOME_MESSAGE'); }); 

或者,如果您想以某种特定方式处理错误,则可以自己尝试/捕捉它:

 public.get('/najam', function *(){ this.body = "hello from najam"; var result; try { result = yield sendSms('YOUR_PHONE', 'SOME_MESSAGE'); } catch(err) { // Maybe we just wanna log the error to a server before rethrowing // it so Koa can handle it logError(err); throw err; } }); 

当用Promise包装某个东西时,只需要在出现错误时调用reject(err) ,并在成功完成时调用resolve(result)

我只是发现如何做到这一点,没有承诺。 这是非常酷的,用最less的代码,没有外部库。 信贷去: 约瑟夫司马

 function sendSmsAsync(phone) { return function(callback) { c.sendSms({to: phone}, callback); } } yield sendSmsAsync("5551212"); 

这个小片段将任何使用节点callback的函数转换为一个生成器。 您也可以在try..catch中包装sendSmsAsync调用。 并且不要忘记在节点中设置–harmony选项。