Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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
如何在Botframework v4中检测对话结束?_Botframework - Fatal编程技术网

如何在Botframework v4中检测对话结束?

如何在Botframework v4中检测对话结束?,botframework,Botframework,我试图在系统中任何其他对话框完成后启动一个反馈对话框。我发现它说使用oneddialog,但这在ActivityHandler中不是有效的函数,只有onDialog。我的“主对话框”位于bot.js扩展ActivityHandler中,这就是我不扩展ComponentDialog的原因。考虑到这是如何设置的,有没有办法确定对话框何时结束?我试图检查对话框中的对话框堆栈,但它的内容是“欢迎消息”和用户的初始消息没有对话框,之后总是显示为“正在运行的对话框”。是否有一种方法可以修改我的函数/bot处

我试图在系统中任何其他对话框完成后启动一个反馈对话框。我发现它说使用
oneddialog
,但这在ActivityHandler中不是有效的函数,只有
onDialog
。我的“主对话框”位于bot.js扩展ActivityHandler中,这就是我不扩展ComponentDialog的原因。考虑到这是如何设置的,有没有办法确定对话框何时结束?我试图检查对话框中的对话框堆栈,但它的内容是“欢迎消息”和用户的初始消息没有对话框,之后总是显示为“正在运行的对话框”。是否有一种方法可以修改我的函数/bot处理程序来检测对话结束事件?这是我试过的onDialog函数

this.onDialog(异步(上下文,下一步)=>{
const currentDialog=等待this.dialogState.get(上下文,{});
如果(currentDialog.dialogStack){
log('对话框正在运行');
}否则{
log('对话框未运行');
}
//通过调用next()可以确保运行下一个BotHandler。
等待下一个();
});

我曾考虑在每个对话框的末尾添加一个额外的步骤来调用反馈对话框(可能是通过replaceDialog),但我不确定这是否是一个最佳做法。

这不能完全做到,因为
endDialog
不会出现任何可以从
ActivityHandler
访问的内容(据我所知)

但作为一个解决办法,你太接近了!将其更改为以下内容:

this.onDialog(异步(上下文,下一步)=>{
const currentDialog=wait this.dialogState.get(上下文);
如果(currentDialog==未定义){
log(“没有启动对话框”);
}else if(currentDialog.dialogStack&¤tDialog.dialogStack.length>0){
log('对话框正在运行');
}否则{
log('对话框未运行');
}
//通过调用next()可以确保运行下一个BotHandler。
等待下一个();
});
你的工作不太正常,只是因为
currentDialog
被设置为
{}
,如果它不存在,这是真实的,所以我们需要检查对话框堆栈中是否有
currentDialog.dialogStack.length>0

currentDialog
未定义的
,如果尚未启动任何对话框,则
currentDialog===未定义的
!currentDialog
允许发送初始消息和欢迎消息。拥有这三个独立的分支应该允许您处理每种情况



关于“最佳实践”,如果你想在每次对话结束时得到反馈,我认为这是正确的方法。如果您不需要任何反馈,最好在相应对话框的末尾调用您的反馈对话框。

这对我记录到控制台的消息有效。但缺少的一点是,当对话框从正在运行变为未运行时,它无法在这种形式下检测到。所以我不能在对话框中设置反馈对话框,因为我可以在没有对话框的情况下做一些事情,比如给QnA Maker打社交电话。因此,这对查找当前对话框状态很有帮助,但并不能完全解决问题。无论如何,考虑到通常情况下,业务案例很少会直接询问何时需要反馈,似乎在适当的对话框中添加作为最后一步是有意义的。还有一个问题,如果在最后一步调用反馈对话框,是否允许只返回等待步骤。替换对话框(反馈对话框)在最后一步,还是我仍然需要在某个地方(反馈对话框除外)设置一个
endDialog
。我的假设是否定的,因为
replaceDialog
将弹出堆栈中的当前对话框,并将其替换为反馈对话框,但我想确保我正确地实现了这一点。@billoverton您的假设与我的相同。由于它返回
beginDialog
调用,因此无论该对话框的最终返回是什么(通常是
endDialog
),它都会冒泡出来。关于手动调用反馈对话框的好消息。这似乎是最好的办法。@billoverton我对我的答案进行了一些编辑,以反映这更像是一种变通办法。如果您确实想确保对话框刚刚结束,您可以保存
对话框堆栈
,并比较每一轮的差异。我仍然喜欢手动方法,但理论上这也能实现你想要的。谢谢,我想现在已经很清楚了。我曾考虑过保存dialogStack,但对于调用反馈对话框的用例来说,这似乎有点过头了。