LoginSignup
3
2

More than 5 years have passed since last update.

ask-sdk で非同期処理してからレスポンス

Posted at

About

知ってる人には当たり前なんでしょうが、
Alexa Skills Kit (ASK) SDK for Node.js バージョン2 で非同期処理をしてから、
Alexa にレスポンスを返す方法。

問題点

v1 は、 this.emit のタイミングでレスポンスを返すので、非同期の最後で emit して動作していたのだが、
v2では handler で同期的に Response を return する必要がある。
・・・と勝手に思っていたんだけど、 interface の定義を見ると Promise<Response> | Response となっていました。

export interface RequestHandler {
    canHandle(handlerInput: HandlerInput): Promise<boolean> | boolean;
    handle(handlerInput: HandlerInput): Promise<Response> | Response;
}

なので、これみたら、 async して await しちゃおう、って気付けるんですがはじめ気づけませんでした。

実装

function execute(msg) {
  return new Promise(resolve => {
    setTimeout(() => {
        resolve();
    }, 1000);
  });
}

const MyIntentHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'MyIntent';
  },
  async handle(handlerInput) {
    await execute('なんか非同期処理');
    return handlerInput.responseBuilder
      .speak('Hello My Intent')
      .reprompt('Hello')
      .getResponse();
  }
};

こうすると非同期処理を実施して resolve or reject すると、
await のブロッキングから抜けるので、なんか後続処理するなり return すると OK です。

サンプルスキルとかで、わりと当たり前に実装されているので今更なんですが。

Reference

[日本語Alexa] Alexa-SDK Ver2(その4) スキル属性 | Developers.IO
ask-sdkでdynamodb - Qiita

おわり。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2