Javascript 如何在Alexa技能中使用特定于会话的变量?

Javascript 如何在Alexa技能中使用特定于会话的变量?,javascript,arrays,amazon-web-services,alexa-skills-kit,alexa-voice-service,Javascript,Arrays,Amazon Web Services,Alexa Skills Kit,Alexa Voice Service,我正在为Alexa开发一个事实技能,使用他们的SpaceGeek模板。 模板本身非常简单,但我正试图通过 确保所使用的事实不会在同一会议中再次出现。所以我 在使用该元素后将其删除。然而,现在出现了一个问题,在会话中删除的元素在以后的会话中甚至不会出现。 因此,我假设全局变量保留在后端,因此创建了一个副本数组,如下所示。但还是不行。所以,在使用了所有事实一次之后,我总是会得到“这就是我们现在拥有的所有事实”。即使我开始新的生活 一场任何帮助都将不胜感激 function handleNew

我正在为Alexa开发一个事实技能,使用他们的SpaceGeek模板。 模板本身非常简单,但我正试图通过 确保所使用的事实不会在同一会议中再次出现。所以我 在使用该元素后将其删除。然而,现在出现了一个问题,在会话中删除的元素在以后的会话中甚至不会出现。 因此,我假设全局变量保留在后端,因此创建了一个副本数组,如下所示。但还是不行。所以,在使用了所有事实一次之后,我总是会得到“这就是我们现在拥有的所有事实”。即使我开始新的生活 一场任何帮助都将不胜感激

    function handleNewFactRequest(response) {
       var COPY_FACTS= SOME_FACTS.splice(0);
       if(COPY_FACTS.length>0){
           var factIndex = Math.floor(Math.random() * COPY_FACTS.length);
           var fact = COPY_FACTS[factIndex];

           // Create speech output
           var speechOutput = "Here's your random fact: " + fact + " would you like more?";
           var repromptOutput = "would you like more random facts?";
           COPY_FACTS.splice(factIndex, 1);
           response.ask(speechOutput, repromptOutput);
      }else{
           var speechOutput = "That's all the facts we have for now.";
           response.tell(speechOutput);
      }
    }

使用
slice()
而不是使用
splice(0)
复制阵列


splice()
函数更改原始数组,其中as
slice()
不更改

正确的处理方法是将数组存储为会话变量,而不是全局对象。详细说明如何执行此操作的示例是,但一般来说,流程如下所示:

处理用户的第一个请求时,创建一个对象,该对象包含要在整个会话期间维护的任何变量,并将其分配给
session.attributes
。您希望将数组存储为该对象上的属性

然后,在未来的事件处理程序中,您将能够访问存储的会话特定变量(即数组),作为该
session.attributes
对象的属性


在链接的示例中,在后续的意图处理程序中,它们包括snippet
sessionAttributes=session.attributes
,以提供更方便的句柄来访问这些变量

这将比OP的代码更糟糕-因为对
splice()
的调用没有分配给变量,所以将其更改为调用
slice()
会导致它创建一个数组的副本,删除元素后会立即放弃。我的评论只针对专门使用
splice(0)
的代码行,它是
var copy\u FACTS=SOME\u FACTS.splice(0)将此行更改为
var COPY_FACTS=SOME_FACTS.slice()
将解决原始事实数组
某些事实变为空的问题。我应该更清楚,这是公平的,但这仍然不会导致删除的问题在回答之间持续存在。它解决了一半的问题,但不是真正重要的一半。