Как вызвать обработчик из другого обработчика, развертывающего навык Alexa? - PullRequest
0 голосов
/ 06 января 2020

Привет всем,

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

Я прочитал несколько постов, но четкого ответа на мою проблему не было. У меня есть обработчик "AskForEmployeeInformation_Handler", который имеет дело с несколькими намерениями, которые отвечают на несколько вопросов о человеке. Но если пользователь говорит только фамилию или имя вместо полного имени, тогда Alexa подскажет, есть ли люди, которые соответствуют данному имени. Теперь пользователь должен сказать одно из предложенных имен. При произнесении этого имени вызывается другой обработчик «SetName_Handler», который устанавливает выбранное имя в качестве атрибута сеанса. Теперь я хочу снова вызвать в операторе return «AskForEmployeeInformation_Handler», потому что он включает в себя весь лог c для запроса требуемой информации.

Я видел несколько решений для вызова обработчика, как вы можете видеть в следующем коде, и лог c был выполнен, но Alexa ничего не сказала и не предлагает пользователю ответ.

У вас есть идея, что я могу сделать, чтобы решить проблему?

Спасибо за вашу помощь.

const SetName_Handler = {
  canHandle(handlerInput){
    const request = handlerInput.requestEnvelope.request;
    let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
    return sessionAttributes.event === 'AskForEmployee_Name' || sessionAttributes.event === 'AskForPhoneNumber_Name' || sessionAttributes.event === 'AskForRole_Name';
  },
  handle(handlerInput) {
    const request = handlerInput.requestEnvelope.request;
    const responseBuilder = handlerInput.responseBuilder;
    let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();

    let say = '';
    let slotValues = getSlotValues(request.intent.slots); 
    console.log('***** slotValues: ' +  JSON.stringify(slotValues, null, 2));

     //save person for the session - maybe for further questions
     sessionAttributes['employeeSurname'] = slotValues.employeeSurname.resolved;
     sessionAttributes['employeeName'] = slotValues.employeeName.resolved;

     handlerInput.attributesManager.setSessionAttributes(sessionAttributes); 

     return AskForEmployeeInformation_Handler.handle(handlerInput; 
  }
};

1 Ответ

0 голосов
/ 09 января 2020

Я думаю, что вам лучше всего отделить логику c от ваших обработчиков. Я никогда не видел необходимости вызывать другой метод Intent handle из другого, и я обнаружил, что это добавило бы осложнения и странные ошибки.

Плоский способ IntentHandler - это рецепт катастрофы, когда ваш навык должен знать о состояниях сеанса и контексте (например, что пользователь делал до вызова этого IntentHandler).

Вместо этого вы можете найти способ подтверждения того, что слоты интерфейса диалогового окна являются именно тем, что вы ищете: https://developer.amazon.com/en-US/docs/alexa/custom-skills/dialog-interface-reference.html

Ознакомьтесь с этой статьей для хорошего обзора, почему / как управлять состоянием и контекстом в приложениях Alexa: https://medium.com/hackernoon/lessons-learned-moving-from-web-to-voice-development-35daa1d301db

...