Javascript 如何在Alexa技能中使用特定于会话的变量?
我正在为Alexa开发一个事实技能,使用他们的SpaceGeek模板。 模板本身非常简单,但我正试图通过 确保所使用的事实不会在同一会议中再次出现。所以我 在使用该元素后将其删除。然而,现在出现了一个问题,在会话中删除的元素在以后的会话中甚至不会出现。 因此,我假设全局变量保留在后端,因此创建了一个副本数组,如下所示。但还是不行。所以,在使用了所有事实一次之后,我总是会得到“这就是我们现在拥有的所有事实”。即使我开始新的生活 一场任何帮助都将不胜感激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
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()
函数更改原始数组,其中asslice()
不更改 正确的处理方法是将数组存储为会话变量,而不是全局对象。详细说明如何执行此操作的示例是,但一般来说,流程如下所示:
处理用户的第一个请求时,创建一个对象,该对象包含要在整个会话期间维护的任何变量,并将其分配给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()
将解决原始事实数组某些事实变为空的问题。我应该更清楚,这是公平的,但这仍然不会导致删除的问题在回答之间持续存在。它解决了一半的问题,但不是真正重要的一半。