1

私は koa.js が初めてで、とても気に入り、プロジェクトを開始しました。SMS送信に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

約束なしでこれを行う方法を見つけました。最小限のコードで、外部ライブラリなしで、かなりクールです。クレジット: Josef Sima

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

reject(err)何かを Promise でラップする場合、エラーが発生しresolve(result)たときと正常に完了したときに呼び出すだけです。

于 2016-02-10T21:30:44.207 に答える