1

我是 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 库,请为我提供代码示例和位解释。

4

2 回答 2

2

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

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

yield sendSmsAsync("5551212");

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

于 2016-06-17T03:43:28.747 回答
1

只需使用 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)成功完成时调用即可。

于 2016-02-10T21:30:44.207 回答