У вас есть пара проблем с вашим кодом по предоставленной вами ссылке.Поскольку я не вижу ваш полный код, я сделал предположение в некоторых частях.
- Дважды проверьте правильность установки userState и userData.Мой конструктор выглядит так:
const DIALOG_STATE_PROPERTY = 'dialogState';
const USER_PROFILE_PROPERTY = 'user';
const EDUCATION_PROMPT = 'education_prompt';
const MAJOR_PROMPT = 'major_prompt';
constructor(conversationState, userState) {
this.conversationState = conversationState;
this.userState = userState;
this.dialogState = this.conversationState.createProperty(DIALOG_STATE_PROPERTY);
this.userData = this.userState.createProperty(USER_PROFILE_PROPERTY);
this.dialogs = new DialogSet(this.dialogState);
// Add prompts that will be used by the main dialogs.
this.dialogs
.add(new TextPrompt(NAME_PROMPT))
.add(new TextPrompt(AGE_PROMPT))
.add(new TextPrompt(GENDER_PROMPT))
.add(new ChoicePrompt(EDUCATION_PROMPT))
.add(new ChoicePrompt(MAJOR_PROMPT));
// Create dialog for prompting user for profile data
this.dialogs.add(new WaterfallDialog(START_DIALOG, [
this.promptForName.bind(this),
this.promptForAge.bind(this),
this.promptForGender.bind(this),
this.promptForEducation.bind(this),
this.promptForMajor.bind(this),
this.returnUser.bind(this)
]));
this.majors = ['English', 'History', 'Computer Science'];
}
Помните, что TextPrompt возвращает значение в step.result.ChoicePrompt возвращает значение как step.result.value
Я предполагаю, что на вашем шаге «promptForEducation», где вы назначаете значение пола для пользователя, это значение исходит из приглашения выбора.Если нет, вы потеряете значение.Проверьте, правильно ли вы указали источник.
.add(new TextPrompt(GENDER_PROMPT))
.add(new ChoicePrompt(EDUCATION_PROMPT))
...
if (!user.gender) {
user.gender = step.result;
// Give user object back to UserState storage
await this.userData.set(step.context, user);
console.log(user);
}
На шаге "promptForMajor" 2-й параметр в шаге. Prompt принимает строку и представляет диалоговую часть выбора.Ваш код должен выглядеть следующим образом и даст следующий результат.В этом случае я присвоил значения «this.majors» в конструкторе (показано выше).
this.majors = ['English', 'History', 'Computer Science'];
...
if (!user.major) {
// Copy List of majors and add "Other" entry
let majorsOther = this.majors.slice(0, this.majors.length);
majorsOther.push('Einen anderen Studiengang');
// return await step.prompt(MAJOR_PROMPT, this.userData.major, majorsOther);
return await step.prompt(MAJOR_PROMPT, 'List of majors:', majorsOther);
}
Проверьте, что вы сохраняете состояние в конце «onTurn».
// Save changes to the user state.
await this.userState.saveChanges(turnContext);
// End this turn by saving changes to the conversation state.
await this.conversationState.saveChanges(turnContext);
Если вы реализуете вышеупомянутое, вы должны быть настроены.Я мог бежать без проблем и без потери состояния.Кроме того, неоднократное отсутствие ответа на ChoicePrompt до окончательного предоставления правильного ответа не нарушало состояние.
Надежда на помощь!