在我的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();
});
技能返回错误消息,没有有关错误的其他详细信息。
有什么办法可以解决此问题?
PS:我需要使用Promise,因为receiveMsgQ()
是异步函数调用。
答案 0 :(得分:4)
您看到的错误是因为NodeJS和Alexa SDK是异步的。正如您从Alexa SDK code中所读到的那样,它会调用您的请求处理程序,并希望返回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();
});
这样,您的处理程序将Promise返回给SDK,并且SDK将使用Promise的结果来构建响应以发送给Alexa。
b /如果使用的是NodeJS 8,则可以使用新的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();
请注意,您的整个处理程序功能必须标记为async
才能起作用。在https://blog.risingstack.com/mastering-async-await-in-nodejs/上了解有关async
和await
的更多信息