如何在 Alexa Skills 中使用 session-specific 变量?
How to use session-specific variables in Alexa Skills?
我正在使用他们的 SpaceGeek 模板为 Alexa 开发事实技能。
模板本身非常简单,但我正在尝试通过以下方式改进它
确保所使用的事实不会在同一个 session 中再次出现。所以我
使用后删除元素。但是,现在出现了一个问题,在 session 中删除的那些元素甚至不会在以后的 session 中出现。
所以我假设全局变量保留在后端,因此创建了一个 copy-array 如下。但它仍然行不通。所以在使用所有事实一次之后,我总是会得到 "That's all the facts we have for now"。即使我开始新的
session。任何帮助将不胜感激。
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);
}
}
不使用 splice(0)
来复制数组,而是使用 slice()
。
splice()
函数改变了原始数组,而slice()
则没有。 See Sirko's response on this question.
处理此问题的正确方法是将数组存储为会话变量,而不是全局对象。 History Buff example skill 是一个详细说明如何执行此操作的示例,但一般来说,过程如下:
在处理用户的第一个请求时,创建一个对象,其中包含您希望在整个会话期间维护的任何变量,并将其分配给 session.attributes
。您希望将数组作为 属性 存储在该对象上。
然后,在未来的事件处理程序中,您将能够访问那些存储的特定于会话的变量(即您的数组)作为该 session.attributes
对象的属性。
在链接的示例中,在后续的意图处理程序中,它们包含代码段 sessionAttributes = session.attributes
以提供更方便的句柄来访问这些变量。
我正在使用他们的 SpaceGeek 模板为 Alexa 开发事实技能。 模板本身非常简单,但我正在尝试通过以下方式改进它 确保所使用的事实不会在同一个 session 中再次出现。所以我 使用后删除元素。但是,现在出现了一个问题,在 session 中删除的那些元素甚至不会在以后的 session 中出现。 所以我假设全局变量保留在后端,因此创建了一个 copy-array 如下。但它仍然行不通。所以在使用所有事实一次之后,我总是会得到 "That's all the facts we have for now"。即使我开始新的 session。任何帮助将不胜感激。
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);
}
}
不使用 splice(0)
来复制数组,而是使用 slice()
。
splice()
函数改变了原始数组,而slice()
则没有。 See Sirko's response on this question.
处理此问题的正确方法是将数组存储为会话变量,而不是全局对象。 History Buff example skill 是一个详细说明如何执行此操作的示例,但一般来说,过程如下:
在处理用户的第一个请求时,创建一个对象,其中包含您希望在整个会话期间维护的任何变量,并将其分配给 session.attributes
。您希望将数组作为 属性 存储在该对象上。
然后,在未来的事件处理程序中,您将能够访问那些存储的特定于会话的变量(即您的数组)作为该 session.attributes
对象的属性。
在链接的示例中,在后续的意图处理程序中,它们包含代码段 sessionAttributes = session.attributes
以提供更方便的句柄来访问这些变量。