有没有一种简单的方法可以在堆栈上获取当前活动的对话框? [英] Is there an easy way to get the currently active dialog on the stack?

查看:17
本文介绍了有没有一种简单的方法可以在堆栈上获取当前活动的对话框?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的bot基于core-bot示例,并且有一个中断功能,可以在对话期间由某些意图调用。如果我在一个对话中,然后中断启动了一个对话框,它们都是通过dc.beginDialog调用的,并且都在对话堆栈的单个级别上。例如,它将如下所示

[ { id: 'viewOrderDialog', state: { dialogs: [Object] } }, { id: 'interruptDialog', state: { dialogs: [Object] } } ]

因此,通过获取数组中最后一个元素的ID,我可以在某种程度上轻松地获取活动对话框。但是,在我的流程中,我可以从interruptDialog启动其他对话框,在本例中是interruptDialog。这些都是通过step.beginDialog从瀑布内部开始的。在这种情况下,它们不再与其他对话框处于同一级别(从DC而不是STEP开始)。我必须进入state.dialogs.dialogStack来查找id,如果该对话框调用另一个对话框,它可能会再次嵌套。以下是dc.activeDialog最终可能是什么样子的示例:

{"id":"interruptDialog","state":{"dialogs":{"dialogStack":[{"id":"waterfallDialog","state":{"options":"expediteOrder","values":{"instanceId":"d61d748e-af45-cea0-9188-63904de21dfc"},"stepIndex":0}},{"id":"escalationDialog","state":{"dialogs":{"dialogStack":[{"id":"waterfallDialog","state":{"options":{},"values":{"instanceId":"6e755278-d636-dd76-3b47-eb43e3eda1c7"},"stepIndex":2}},{"id":"emailDialog","state":{"dialogs":{"dialogStack":[{"id":"waterfallDialog","state":{"options":{},"values":{"instanceId":"87f08019-ff59-ce03-ccab-7914fb0b553b"},"stepIndex":1}},{"id":"emailPrompt","state":{"options":{"prompt":"Which email address do you want us to reply to?"},"state":{}}}]}}}]}}}]}}}

我可以降到最低级别,在本例中是emailPrompt,但是检查和查看是否每个级别的Dialog/DialogStack都是一个数组似乎要花费过多的开销。(是的,我可能应该将我的瀑布对话框命名为其他名称,而不是将其命名为Waterfall Dialog)。我希望有一种简单的方法可以将最新的对话框从堆栈中取出,但我找不到任何东西来提供该信息。

在不太一般的意义上,我专门尝试向中断添加一个条件,以防止在某些对话框中调用它。我有一个步骤,用户可以写一个电子邮件正文,如果他们写了一些关于加快订单,中断是激活。在这个特定的案例中,我决定通过将dc.activeDialog转换为字符串,然后检查它是否包含‘emailDialog’来解决这个问题。然后为!activeDialog.includes('emailDialog')添加一个条件。对于这种情况可以很好地工作,但我问了更一般的问题,因为在其他需要知道我在哪个对话框中的情况下,这可能不是一个很好的解决方案。

如果需要,我可以提供代码片段,但是代码本身并不重要。我只是在尝试确定从对话上下文中获取当前活动对话的ID的最佳方式。

推荐答案

您看到嵌套对话框堆栈的原因是您正在使用component dialogs

如果您的中断总是在根对话框上下文中执行,并且您的中断对话框就是在根对话框上下文中添加的,那么应该没有必要将挖洞放入嵌套的对话栈中。由于中断对话框将始终位于根对话框堆栈中,因此您可以只检查根对话框上下文,以查看活动对话框是否为中断对话框。

我不知道有什么内置的方法来确定最里面的活动对话框,但如果这确实是您想要做的,那么创建一个递归函数来完成应该不难:

getInnermostActiveDialog(dc) {
    var child = dc.child;

    return child ? this.getInnermostActiveDialog(child) : dc.activeDialog;
}
应该注意,Core Bot示例通过使特定对话框扩展common base dialog class,然后处理来自对话框内的中断而不是来自BOT类的中断,使得它们只能被中断。您可能希望效仿该示例,让对话框"选择加入"中断性,而不是让中断对话框"选择退出"。

这篇关于有没有一种简单的方法可以在堆栈上获取当前活动的对话框?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆