大家好,
目前,我正在研究Alexa技能,但是我有一个问题,我需要从另一个人中调用处理程序。
我读了几篇文章,但是对我的问题没有明确的答案。我有一个处理程序“ AskForEmployeeInformation_Handler”,它处理几个意图,这些意图回答有关一个人的几个问题。但是,如果用户仅说姓或名而不是全名,则Alexa会提示是否有人与给定名称匹配。用户现在应该说出建议的名称之一。在说出该名称时,将调用另一个处理程序“ SetName_Handler”,该处理程序将所选名称设置为会话属性。现在,我想再次在return语句中调用“ AskForEmployeeInformation_Handler”,因为它包括提示所需信息的整个逻辑。
我看到了一些调用处理程序的解决方案,就像在下面的代码中看到的那样,并且逻辑已执行,但是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;
}
};
我认为您最好的选择是将逻辑与处理程序分开。我从来没有见过需要从另一个调用另一个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