Повторный ChoicePrompt очищает UserState - PullRequest
0 голосов
/ 22 февраля 2019

Я реализовал бота с помощью Microsoft BotFramework.Для сбора пользовательских данных я использую ChoicePrompts.Когда пользователь не выбирает одну из предложенных опций, ChoicePrompt повторяется до тех пор, пока пользователь не введет допустимую опцию (это поведение по умолчанию из метода подсказки).

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

Это поведение предназначено или есть способ предотвратить это?

1 Ответ

0 голосов
/ 19 марта 2019

У вас есть пара проблем с вашим кодом по предоставленной вами ссылке.Поскольку я не вижу ваш полный код, я сделал предположение в некоторых частях.

  1. Дважды проверьте правильность установки 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);
}

enter image description here

Проверьте, что вы сохраняете состояние в конце «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 до окончательного предоставления правильного ответа не нарушало состояние.

enter image description here

Надежда на помощь!

...