【问题标题】:Returning handler.ResponseBuilder from promise.then() method从 promise.then() 方法返回 handler.ResponseBuilder
【发布时间】:2018-08-10 07:12:09
【问题描述】:

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

【问题讨论】:

  • 请格式化您的代码
  • nodejs 日志中的错误是什么
  • 我只能在日志中看到一行:“会话以原因结束:错误”

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


【解决方案1】:

您看到的错误是因为 NodeJS 和 Alexa SDK 是异步的。正如您从Alexa SDK code 中看到的那样,它会调用您的请求处理程序并期望返回一个 Promise。在您的示例中,由于您的代码在调用 rcvPromise.then 后没有显式返回任何内容,因此会返回一个空响应,并且 SDK 会向 Alexa 发送一个空响应,从而导致错误。当您的then() 函数将被执行时,Alexa 响应已经发送并且您的handlerInput.responseBuilder 结果被忽略。

要解决这个问题,你有两种解决方案:

a/可以在rcvPromise.then之前插入return语句,如

return rcvPromise.then(function(speechText) {
   console.log('rcv Promise resolved with ',speechText);
     return handlerInput.responseBuilder
       .speak(speechText) 
       .withSimpleCard('skill_name', speechText) 
       .withShouldEndSession(false)
       .getResponse();
 });   

这样,您的处理程序将向 SDK 返回一个 Promise,而 SDK 将使用该承诺的结果来构建响应以发送给 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 的信息

【讨论】:

    猜你喜欢
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2021-04-21
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多