4

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

    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);
      }
    }
4

2 回答 2

3

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

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

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

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

于 2016-05-04T18:27:16.080 回答
-1

不要使用splice(0)复制数组,而是使用slice().

splice()函数会更改原始数组,而 asslice()不会。请参阅 Sirko 对此问题的回复

于 2016-04-20T18:54:35.603 回答