Posted at

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

More than 1 year has passed since last update.


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

おわり。