Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重复的ChoicePrompt清除用户状态_Javascript_Botframework_Prompt - Fatal编程技术网

Javascript 重复的ChoicePrompt清除用户状态

Javascript 重复的ChoicePrompt清除用户状态,javascript,botframework,prompt,Javascript,Botframework,Prompt,我用Microsoft bot框架实现了一个机器人。为了收集用户数据,我使用ChoicePrompts。当用户没有选择其中一个建议的选项时,ChoicePrompt将重复,直到用户输入有效的选项(这是prompt方法的默认行为) 不幸的是,在没有选择一个有效的选项之后,用户状态将被刷新。这意味着在此之前,我将丢失所有收集的用户数据 这种行为是有意的还是有办法防止这种情况发生?您提供的链接上的代码存在一些问题。由于我看不到您的完整代码,我对某些部分进行了猜测 仔细检查userState和userD

我用Microsoft bot框架实现了一个机器人。为了收集用户数据,我使用ChoicePrompts。当用户没有选择其中一个建议的选项时,ChoicePrompt将重复,直到用户输入有效的选项(这是prompt方法的默认行为)

不幸的是,在没有选择一个有效的选项之后,用户状态将被刷新。这意味着在此之前,我将丢失所有收集的用户数据


这种行为是有意的还是有办法防止这种情况发生?

您提供的链接上的代码存在一些问题。由于我看不到您的完整代码,我对某些部分进行了猜测

  • 仔细检查userState和userData是否正确设置。我的构造函数如下所示:
  • const DIALOG_STATE_属性='dialogState';
    const USER_PROFILE_属性='USER';
    const EDUCATION_PROMPT='EDUCATION_PROMPT';
    常量主提示='主提示';
    构造函数(会话状态、用户状态){
    this.conversationState=会话状态;
    this.userState=userState;
    this.dialogState=this.conversationState.createProperty(DIALOG\u STATE\u属性);
    this.userData=this.userState.createProperty(用户配置文件属性);
    this.dialogs=新的DialogSet(this.dialogState);
    //添加将由主对话框使用的提示。
    这是对话
    .add(新文本提示(名称提示))
    .add(新文本提示(年龄提示))
    .add(新文本提示(性别提示))
    .add(新选项提示(教育提示))
    .添加(新选项提示(主要提示));
    //创建用于提示用户输入配置文件数据的对话框
    this.dialogs.add(新建WaterWallDialog(启动)对话框[
    this.promptForName.bind(this),
    这个.提示.绑定(这个),
    这个。提示者。绑定(这个),
    这个。促进教育。约束(这个),
    本协议主要约束(本协议),
    this.returnUser.bind(this)
    ]));
    本专业=[‘英语’、‘历史’、‘计算机科学’];
    }
    
  • 请记住,TextPrompt在step.result中返回值。ChoicePrompt将值作为step.result.value返回

    我假设在“promptForEducation”步骤中,您将性别值分配给用户,该值来自选择提示。否则,您将失去价值。仔细检查您是否指定了正确的源

  • .add(新文本提示(性别提示))
    .add(新选项提示(教育提示))
    ...
    如果(!user.gender){
    user.gender=step.result;
    //将用户对象返回给UserState存储
    等待这个.userData.set(step.context,user);
    console.log(用户);
    }
    
  • 在“PromptFormJor”步骤中,步骤.Prompt中的第二个参数采用字符串并表示选项的对话框部分。您的代码应该如下所示,并将生成以下输出。在本例中,我为构造函数中的“this.majors”赋值(如上所示)
  • this.majors=[“英语”、“历史”、“计算机科学”];
    ...
    如果(!user.major){
    //复制专业列表并添加“其他”条目
    设majorsOther=this.majors.slice(0,this.majors.length);
    majorsOther.push('Einen anderen Studiengang');
    //返回等待步骤.prompt(MAJOR\u prompt,this.userData.MAJOR,majorsOther);
    返回等待步骤。提示符(专业提示,'专业列表:',专业其他);
    }
    

  • 检查是否在“onTurn”结尾保存状态
  • //保存对用户状态的更改。
    等待this.userState.saveChanges(turnContext);
    //通过保存对对话状态的更改来结束本回合。
    等待这个.conversationState.saveChanges(turnContext);
    
    如果实现了上述功能,则应设置。我能够在没有问题和状态损失的情况下运行。此外,在最终提供适当的响应之前,反复不回答ChoicePrompt并没有破坏状态


    希望有帮助

    当选择有效选项时,不应清除UserState。请分享你正在使用的ChoicePrompt代码。正如@EricDahlvang提到的,如果你能发布你的代码,那将非常有帮助。您还可以验证用户状态在刷新之前是否已保存?您好,谢谢您的回复@EricDahlvang用户状态仅在选择无效选项时清除。您可以在此处找到我的代码: