3

Я разрабатываю навык для Alexa, используя их шаблон SpaceGeek. Сам шаблон очень прост, но я пытаюсь улучшить его на , убедившись, что используемые факты не появятся снова в том же сеансе. Поэтому I удалите элемент после его использования. Однако теперь проблема заключается в том, что те элементы, которые были удалены в сеансе, даже не появятся в будущих сеансах. Итак, я предполагаю, что глобальная переменная остается в бэкэнд и, таким образом, создает массив копий, как показано ниже. Но это все равно не сработает. Поэтому, после использования всех фактов один раз, я всегда буду получать «Это все факты, которые мы имеем сейчас». Даже если я начну новую сессию . Любая помощь будет оценена по достоинству.Как использовать переменные сеанса в Alexa Skills?

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

ответ

2

Правильный способ справиться с этим состоит в том, чтобы хранить массив как переменную сеанса, а не как глобальный объект. Пример, который показывает, как это сделать подробно, будет History Buff example skill, но, как правило, процесс выглядит следующим образом:

При обработке первого запроса пользователя создайте объект, который содержит любые переменные, которые вы хотите сохранить на протяжении всего сеанса и назначьте его session.attributes. Вы хотите сохранить свой массив как свойство на этом объекте.

Затем в будущих обработчиках событий вы сможете получить доступ к тем сохраненным переменным, зависящим от сеанса (т. Е. Ваш массив), как свойства этого объекта session.attributes.

В связанном примере в последующих обработчиках целей они включают фрагмент sessionAttributes = session.attributes, чтобы предоставить более удобный дескриптор для доступа к этим переменным.

-1

Вместо того, чтобы использовать splice(0) дублировать массив, используйте slice().

Функция splice() изменяет исходный массив, где slice() нет. See Sirko's response on this question.

+0

Это будет работать даже хуже, чем код OP. Поскольку вызов 'splice()' не присваивается переменной, изменение его для вызова 'slice()' приведет к созданию копии массив с удаленным элементом, который будет немедленно оставлен. –

+0

Мой комментарий был направлен только на строку кода, которая специально использовала 'splice (0)' которая была 'var COPY_FACTS = SOME_FACTS.splice (0);' Изменение этой строки на 'var COPY_FACTS = SOME_FACTS.slice();' будет решить проблему из-за того, что исходный массив фактов 'SOME_FACTS' становится пустым. Я должен был быть яснее, – GregI

+0

Это справедливо, но это все равно никоим образом не приведет к тому, что удаленные вопросы будут сохраняться между ответами. Это решает половину проблемы, но не очень важную половину. –

Смежные вопросы