【问题标题】:converting convention node.js function with callback to generators and yield将带有回调的约定 node.js 函数转换为生成器并产生
【发布时间】:2016-05-20 21:52:13
【问题描述】:

我是 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?
        }      
    });
});    

如何修改它以将其放入生成器函数中,在什么时候我将使用 yield 关键字?

如果您的回答建议使用 Co 库,请提供示例代码和位解释。

【问题讨论】:

    标签: javascript node.js koa co


    【解决方案1】:

    我刚刚发现如何在没有承诺的情况下做到这一点。它非常酷,代码最少,没有外部库。归功于:Josef Sima

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

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

    【讨论】:

    • 如何指出错误? Promise 允许您为此使用 reject()。
    【解决方案2】:

    只需使用 Promise 包装基于回调的接口,以便您可以在路由中产生它。

    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);
        });
      });
    }
    

    现在您可以在路线内产生它。如果它抛出一个错误 (就像网络宕机一样),那么 Koa 的默认错误处理程序将 抓住它并把它变成一个 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)

    【讨论】:

      猜你喜欢
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 2018-07-09
      • 2020-02-22
      • 2018-11-24
      • 2020-04-23
      相关资源
      最近更新 更多