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
おわり。