Как бы я попросил пользователя список имен? - PullRequest
7 голосов
/ 24 апреля 2019

Я создаю собственный навык 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 спросила, пока не будет достигнуто конечное условие.

1 Ответ

1 голос
/ 13 мая 2019

После некоторых исследований я понял, что ответ на самом деле прост. Чтобы собрать свои имена, мне нужно зациклить намерение, пока не будет выполнено определенное условие. Я могу сделать это, проверив состояние моего навыка в функции 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()
    }
  }
}

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

...