Pra*_*esh 3 alexa node.js alexa-skill alexa-skills-kit
在我的Alexa技能的意图处理程序之一中,我的诺言一旦解决,我就必须返回响应。
代码如下:
var rcvPromise = receiveMsgQ();
rcvPromise.then(function(speechText) {
console.log('rcv Promise resolved with ',speechText);
return handlerInput.responseBuilder
.speak(speechText)
.withSimpleCard('skill_name', speechText)
.withShouldEndSession(false)
.getResponse();
});
Run Code Online (Sandbox Code Playgroud)
技能返回错误消息,没有有关错误的其他详细信息。
有什么办法可以解决这个问题?
PS:我需要使用promise作为receiveMsgQ()异步函数调用。
您看到的错误是因为NodeJS和Alexa SDK是异步的。正如您可以从Alexa SDK代码中读取的那样,它会调用您的请求处理程序,并期望返回Promise。在您的示例中,由于您的代码在调用后没有显式返回任何内容rcvPromise.then,因此将返回空响应,并且SDK将空响应发送给Alexa,从而导致错误。当您的then()函数将被执行时,Alexa响应已经发送,您的handlerInput.responseBuilder结果将被忽略。
要解决此问题,您有两种解决方案:
a /您可以return在之前插入一条语句 rcvPromise.then,例如
return rcvPromise.then(function(speechText) {
console.log('rcv Promise resolved with ',speechText);
return handlerInput.responseBuilder
.speak(speechText)
.withSimpleCard('skill_name', speechText)
.withShouldEndSession(false)
.getResponse();
});
Run Code Online (Sandbox Code Playgroud)
这样,您的处理程序将Promise返回给SDK,并且SDK将使用Promise的结果来构建响应以发送给Alexa。
b /如果使用的是NodeJS 8,则可以使用new await/ async语法。在幕后,它与上述解决方案相同,但是它将使代码更易于阅读。
var speechText = await receiveMsgQ();
console.log('rcv Promise resolved with ',speechText);
return handlerInput.responseBuilder
.speak(speechText)
.withSimpleCard('skill_name', speechText)
.withShouldEndSession(false)
.getResponse();
Run Code Online (Sandbox Code Playgroud)
请注意,必须将整个处理程序功能标记为async可以正常工作。了解更多关于async和await在https://blog.risingstack.com/mastering-async-await-in-nodejs/
| 归档时间: |
|
| 查看次数: |
587 次 |
| 最近记录: |