从promise.then()方法返回handler.ResponseBuilder

时间:2018-08-10 07:12:09

标签: node.js alexa alexa-skills-kit alexa-skill

在我的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()是异步函数调用。

1 个答案:

答案 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/上了解有关asyncawait的更多信息