Я реализовал бота с помощью Microsoft BotFramework.Для сбора пользовательских данных я использую ChoicePrompts.Когда пользователь не выбирает один из предложенных параметров, ChoicePrompt повторяется до тех пор, пока пользователь не введет допустимый параметр (это поведение по умолчанию из метода подсказки).
К сожалению, stepContext, кажется, обновляется, если ChoicePrompt перекомпоновывает пользователя.Я использовал эту документацию для хранения пользовательских данных.Это означает, что я теряю данные, которые были получены от пользователя до тех пор.
Это мой диалог:
// Create dialog for prompting user for profile data
this.dialogSet.add(new WaterfallDialog('createProfile', [
this.promptForName.bind(this),
this.promptForAge.bind(this),
this.promptForGender.bind(this),
this.promptForEducation.bind(this),
this.promptForMajor.bind(this),
this.promptForOtherMajor.bind(this),
this.completeProfile.bind(this)
]));
Это методы, в которых возникает проблема.В "promptForEducation" используется ChoicePrompt.
async promptForEducation (step) {
console.log("Education Prompt");
// Retrieve user object from UserState storage
const user = await this.userData.get(step.context, {});
// Before saving entry, check if it already exists
if(!user.gender){
user.gender = step.result.value;
// Give user object back to UserState storage
await this.userData.set(step.context, user);
}
// Before prompting, check if value already exists
if (!user.education){
const user = await this.userData.get(step.context, {});
console.log(user);
// Prompt for highest education with list of education options
return await step.prompt('choicePrompt', 'What is your highest education', ['Bachelor', 'Master']);
} else {
return await step.next();
}
}
async promptForMajor (step) {
console.log("Major Prompt");
// Retrieve user object from UserState storage
const user = await this.userData.get(step.context, {});
console.log(user);
// Before saving entry, check if it already exists
if(!user.education){
user.education = step.result.value;
// Give user object back to UserState storage
await this.userData.set(step.context, user);
console.log(user);
}
// Before prompting, check if value already exists
if (!user.major){
// Copy List of majors and add "Other" entry
let majorsOther = majors.slice(0,majors.length);
majorsOther.push("Einen anderen Studiengang");
return await step.prompt('choicePrompt', userData.major.prompt, majorsOther);
} else {
return await step.next();
}
}
Как видите, я извлекаю данные пользователя следующим образом:
// Retrieve user object from UserState storage
const user = await this.userData.get(step.context, {});
И сохраняю их так:
// Give user object back to UserState storage
await this.userData.set(step.context, user);
При непосредственном выборедопустимая опция из массива "образование", все хорошо.Вот так выглядит мой вывод на консоль (я регистрирую объект "пользователь" 3 раза в отрезанном виде. Один раз до и дважды после ChoicePrompt)
Пользователь добавил имя Подсказка Возраст Подсказка Пол Подсказка Образование Подсказка{имя: «Джон Доу», возраст: 18 лет, пол: «Männlich»} Основная подсказка {имя: «Джон Доу», возраст: 18 лет, пол: «Мяннлих»} {имя: «Джон Доу», возраст: 18 лет,пол: 'Männlich', образование: 'бакалавр'}
Как только я отвечаю на ChoicePrompt с недопустимым сообщением, я получаю повторный запрос, но затем "StepContext", кажется, обновляется, и мой "пользователь"Объект пуст:
Пользователь добавил имя Подсказка Возраст Подсказка Пол Подсказка Образование Подсказка {имя: 'Джон Доу 2', возраст: 18, пол: 'Männlich'} Основная подсказка {} {образование: 'Бакалавр '}
Есть ли способ это исправить?Я использую какой-то метод, отличный от того, как он предназначен?Заранее спасибо.