我将如何向用户询问姓名列表?
How would I ask the user for a list of names?
我正在创建自定义 Alexa 技能,它需要收集用户说出的未知数量的名字。
我试过将名字存储在一个插槽中。我能够以这种方式获得一个名字,但不能获得多个。现在,我正在尝试向用户询问一些人,然后向用户询问姓名。但是,我无法弄清楚如何使该解决方案起作用。另外,我正在尝试将名称存储在会话属性中。
这是我目前所拥有的
// Api call wrapped into a promise. Returns the person's email.
return findEmployee(sessionAttributes.client, givenName)
.then(attendee => {
let prompt = ''
if (attendee.value.length === 1) {
sessionAttributes.attendees = [...sessionAttributes.attendees, attendee.value[0]]
prompt = `${attendee.value.displayName} added to the meeting.`
return handlerInput.responseBuilder
.speak(prompt)
.reprompt(prompt)
.getResponse()
}
})
.catch(err => console.log(err))
此代码片段适用于一个人,但我该如何重构它,以便 Alexa 会询问直到达到结束条件。
经过一番研究,我发现答案其实很简单。为了收集我的名字,我需要循环一个意图,直到满足某个条件。我可以通过在 "canHandle" 函数中检查我的技能状态并在我的响应中使用 if 语句来做到这一点。
假设我有一个名为 number 的插槽,它被设置为一个随机数。
const AddNameHandler = {
canHandle (handlerInput) {
const request = handlerInput.requestEnvelope.request
const attributesManager = handlerInput.attributesManager
const sessionAttributes = attributesManager.getSessionAttributes()
const slots = request.intent.slots
return handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
(sessionAttributes.names < slots.number)
},
handle (handlerInput) {
const request = handlerInput.requestEnvelope.request
const attributesManager = handlerInput.attributesManager
const sessionAttributes = attributesManager.getSessionAttributes()
const slots = request.intent.slots
// Collect the name
sessionAttributes.names += 1
if (sessionAttributes.names !== slots.number) {
handlerInput.responseBuilder
.speak('Say another name.')
.reprompt('Say another name')
.getResponse()
} else {
handlerInput.responseBuilder
.speak('Got the names.')
.getResponse()
}
}
}
此示例将收集一个名称列表,如果我想在达到名称限制时触发另一个处理程序,我只需要创建另一个具有新条件的处理程序。
我正在创建自定义 Alexa 技能,它需要收集用户说出的未知数量的名字。
我试过将名字存储在一个插槽中。我能够以这种方式获得一个名字,但不能获得多个。现在,我正在尝试向用户询问一些人,然后向用户询问姓名。但是,我无法弄清楚如何使该解决方案起作用。另外,我正在尝试将名称存储在会话属性中。
这是我目前所拥有的
// Api call wrapped into a promise. Returns the person's email.
return findEmployee(sessionAttributes.client, givenName)
.then(attendee => {
let prompt = ''
if (attendee.value.length === 1) {
sessionAttributes.attendees = [...sessionAttributes.attendees, attendee.value[0]]
prompt = `${attendee.value.displayName} added to the meeting.`
return handlerInput.responseBuilder
.speak(prompt)
.reprompt(prompt)
.getResponse()
}
})
.catch(err => console.log(err))
此代码片段适用于一个人,但我该如何重构它,以便 Alexa 会询问直到达到结束条件。
经过一番研究,我发现答案其实很简单。为了收集我的名字,我需要循环一个意图,直到满足某个条件。我可以通过在 "canHandle" 函数中检查我的技能状态并在我的响应中使用 if 语句来做到这一点。
假设我有一个名为 number 的插槽,它被设置为一个随机数。
const AddNameHandler = {
canHandle (handlerInput) {
const request = handlerInput.requestEnvelope.request
const attributesManager = handlerInput.attributesManager
const sessionAttributes = attributesManager.getSessionAttributes()
const slots = request.intent.slots
return handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
(sessionAttributes.names < slots.number)
},
handle (handlerInput) {
const request = handlerInput.requestEnvelope.request
const attributesManager = handlerInput.attributesManager
const sessionAttributes = attributesManager.getSessionAttributes()
const slots = request.intent.slots
// Collect the name
sessionAttributes.names += 1
if (sessionAttributes.names !== slots.number) {
handlerInput.responseBuilder
.speak('Say another name.')
.reprompt('Say another name')
.getResponse()
} else {
handlerInput.responseBuilder
.speak('Got the names.')
.getResponse()
}
}
}
此示例将收集一个名称列表,如果我想在达到名称限制时触发另一个处理程序,我只需要创建另一个具有新条件的处理程序。