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

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

Séb*_*acq 5

您看到的错误是因为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可以正常工作。了解更多关于asyncawaithttps://blog.risingstack.com/mastering-async-await-in-nodejs/