如何循环遍历 Alexa Intent 中的对象数组?
How to loop through a object array in an Alexa Intent?
所以问题是我无法在 quizIntent 处理程序的循环中遍历问题数组。仅显示第一个问题,然后不再移动。其余代码工作正常。
我想做的是继续提问,直到数组用完,并在用户给出错误答案时跳出循环。
我只是 Alexa 编程的新手。请帮忙。
这是我的数组
const got = [
{
question: "Grey Wind, Lady, Ghost, Shaggydog, Summer and the sixth direwolve's name is?",
answer: 'nymeria',
},
{
question: "What was the name of the sinister castle where Arya and Gendry were held prisoner in season two?",
answer: 'harrenhal',
},
{
question: "What is a person called that can enter the minds of animals?",
answer: 'warg',
},
{
question: "What was the name of the Stark ancestral sword that was melted down by Tywin Lannister?",
answer: 'ice',
}
];
这是我的 Alexa Intent
var handlers = {
"customIntent": function () {
this.response.speak("Would you like to appear for a trial by combat");
this.emit(":responseReady");
},
"quizIntent": function () {
var mydecision = this.event.request.intent.slots.decision.value;
if(mydecision=='no'||mydecision=='nope'||mydecision=='naah'){
this.response.speak("A five year old has more courage than you.");
this.emit(":responseReady");
}
for(var i = 0; i <got.length; i++){
var myanswer = this.event.request.intent.slots.answer.value;
var item = got[i].question;
this.response.speak(item).listen();
if(myanswer!=got[i].answer){
this.response.speak("Wrong Answer. You are dead");
this.emit(':responseReady');
}
if(i==got.length-1){
this.response.speak("You won");
this.emit(':responseReady');
}
}
},
"LaunchRequest": function () {
this.response.speak("Valar Morghulis").listen("You are supposed to say Valar Dohareis");
this.emit(":responseReady");
}
};
这是我的 Intent Schema,如果你也想看的话
{
"languageModel": {
"types": [
{
"name": "answerSlot",
"values": [
{
"id": null,
"name": {
"value": "Nymeria",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Harrenhal",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Warg",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Ice",
"synonyms": []
}
}
]
},
{
"name": "decisionSlot",
"values": [
{
"id": null,
"name": {
"value": "Yes",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "No",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Naah",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Yeah",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Yup",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Nope",
"synonyms": []
}
}
]
}
],
"intents": [
{
"name": "AMAZON.CancelIntent",
"samples": []
},
{
"name": "AMAZON.HelpIntent",
"samples": []
},
{
"name": "AMAZON.StopIntent",
"samples": []
},
{
"name": "customIntent",
"samples": [
"Valar Dohareis",
"hello",
"hola"
],
"slots": []
},
{
"name": "quizIntent",
"samples": [
"{decision}",
"The answer is {answer}"
],
"slots": [
{
"name": "decision",
"type": "decisionSlot"
},
{
"name": "answer",
"type": "answerSlot"
}
]
}
],
"invocationName": "quiz game"
}
}
for loop doesn't serve any purpose as intent is designed to give a single response on every single invocation. So though you're for 循环将是 运行,它不会发出第二个响应,因为第一次迭代的 listen 方法将从头开始执行,因为它是一个新的调用。
使用Session属性可以顺利达到你想达到的目的。
var iterations = 0; //defined globally
// Later on, for every iteration, you simply need to call
// into the attributes property of the alexa object to change the value.
this.attributes['iterations'] = iterations + 1;
我想出解决这个问题的一种方法是:
var i = 0;
var handlers = {
"customIntent": function () {
this.response.speak("Would you like to take part in a trial by combat?").listen();
this.emit(":responseReady");
},
"quizIntent": function () {
var mydecision = this.event.request.intent.slots.decision.value;
if(mydecision=='no'||mydecision=='nope'||mydecision=='naah'){
this.response.speak("Battles have been won against harder odds! Even little Lyanna Mormont has more courage than you.");
this.emit(":responseReady");
}
if(i<=got.length){
var item = got[i].question;
if(i == 0){
this.response.speak("Be attentive; just like life, I won't repeat or give you a second chance. Here you go; " + item).listen();
this.emit(":responseReady");
}
else {
this.response.speak(item).listen();
this.emit(":responseReady");
}
}
},
"answerIntent": function () {
var myanswer = this.event.request.intent.slots.answer.value;
if(myanswer!=got[i].answer){
this.response.speak("Wrong Answer. The correct answer is " + got[i].answer + ". You are dead.");
this.emit(':responseReady');
}
i++;
if(i==got.length){
i=0;
this.response.speak("You emerged the ultimate victor. The best in all of Planetos.");
this.emit(':responseReady');
}
this.response.speak("You survived. Say ready, when you are, for the next combat!").listen();
this.emit(':responseReady');
},
想法是在测验意图和回答意图之间来回切换。
所以问题是我无法在 quizIntent 处理程序的循环中遍历问题数组。仅显示第一个问题,然后不再移动。其余代码工作正常。 我想做的是继续提问,直到数组用完,并在用户给出错误答案时跳出循环。
我只是 Alexa 编程的新手。请帮忙。
这是我的数组
const got = [
{
question: "Grey Wind, Lady, Ghost, Shaggydog, Summer and the sixth direwolve's name is?",
answer: 'nymeria',
},
{
question: "What was the name of the sinister castle where Arya and Gendry were held prisoner in season two?",
answer: 'harrenhal',
},
{
question: "What is a person called that can enter the minds of animals?",
answer: 'warg',
},
{
question: "What was the name of the Stark ancestral sword that was melted down by Tywin Lannister?",
answer: 'ice',
}
];
这是我的 Alexa Intent
var handlers = {
"customIntent": function () {
this.response.speak("Would you like to appear for a trial by combat");
this.emit(":responseReady");
},
"quizIntent": function () {
var mydecision = this.event.request.intent.slots.decision.value;
if(mydecision=='no'||mydecision=='nope'||mydecision=='naah'){
this.response.speak("A five year old has more courage than you.");
this.emit(":responseReady");
}
for(var i = 0; i <got.length; i++){
var myanswer = this.event.request.intent.slots.answer.value;
var item = got[i].question;
this.response.speak(item).listen();
if(myanswer!=got[i].answer){
this.response.speak("Wrong Answer. You are dead");
this.emit(':responseReady');
}
if(i==got.length-1){
this.response.speak("You won");
this.emit(':responseReady');
}
}
},
"LaunchRequest": function () {
this.response.speak("Valar Morghulis").listen("You are supposed to say Valar Dohareis");
this.emit(":responseReady");
}
};
这是我的 Intent Schema,如果你也想看的话
{
"languageModel": {
"types": [
{
"name": "answerSlot",
"values": [
{
"id": null,
"name": {
"value": "Nymeria",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Harrenhal",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Warg",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Ice",
"synonyms": []
}
}
]
},
{
"name": "decisionSlot",
"values": [
{
"id": null,
"name": {
"value": "Yes",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "No",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Naah",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Yeah",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Yup",
"synonyms": []
}
},
{
"id": null,
"name": {
"value": "Nope",
"synonyms": []
}
}
]
}
],
"intents": [
{
"name": "AMAZON.CancelIntent",
"samples": []
},
{
"name": "AMAZON.HelpIntent",
"samples": []
},
{
"name": "AMAZON.StopIntent",
"samples": []
},
{
"name": "customIntent",
"samples": [
"Valar Dohareis",
"hello",
"hola"
],
"slots": []
},
{
"name": "quizIntent",
"samples": [
"{decision}",
"The answer is {answer}"
],
"slots": [
{
"name": "decision",
"type": "decisionSlot"
},
{
"name": "answer",
"type": "answerSlot"
}
]
}
],
"invocationName": "quiz game"
}
}
for loop doesn't serve any purpose as intent is designed to give a single response on every single invocation. So though you're for 循环将是 运行,它不会发出第二个响应,因为第一次迭代的 listen 方法将从头开始执行,因为它是一个新的调用。
使用Session属性可以顺利达到你想达到的目的。
var iterations = 0; //defined globally
// Later on, for every iteration, you simply need to call
// into the attributes property of the alexa object to change the value.
this.attributes['iterations'] = iterations + 1;
我想出解决这个问题的一种方法是:
var i = 0;
var handlers = {
"customIntent": function () {
this.response.speak("Would you like to take part in a trial by combat?").listen();
this.emit(":responseReady");
},
"quizIntent": function () {
var mydecision = this.event.request.intent.slots.decision.value;
if(mydecision=='no'||mydecision=='nope'||mydecision=='naah'){
this.response.speak("Battles have been won against harder odds! Even little Lyanna Mormont has more courage than you.");
this.emit(":responseReady");
}
if(i<=got.length){
var item = got[i].question;
if(i == 0){
this.response.speak("Be attentive; just like life, I won't repeat or give you a second chance. Here you go; " + item).listen();
this.emit(":responseReady");
}
else {
this.response.speak(item).listen();
this.emit(":responseReady");
}
}
},
"answerIntent": function () {
var myanswer = this.event.request.intent.slots.answer.value;
if(myanswer!=got[i].answer){
this.response.speak("Wrong Answer. The correct answer is " + got[i].answer + ". You are dead.");
this.emit(':responseReady');
}
i++;
if(i==got.length){
i=0;
this.response.speak("You emerged the ultimate victor. The best in all of Planetos.");
this.emit(':responseReady');
}
this.response.speak("You survived. Say ready, when you are, for the next combat!").listen();
this.emit(':responseReady');
},
想法是在测验意图和回答意图之间来回切换。