botframework - 如何从单独的瀑布对话框中取消所有对话框

标签 botframework

我有用于查看订单和加急订单的对话框。用户可能希望在 viewOrder 对话框的中间加速,然后返回以查找更多订单项。我正在检查加速意图作为中断并将对话框推送到堆栈上。

在对话框结束时,我会提示用户是否要返回到之前的对话。如果是,我调用 endDialog 将对话框从堆栈中弹出并返回到上一个对话框。这是有效的。如果否,我调用cancelAllDialogs。我希望这会清除对话框堆栈,但它似乎只取消当前(加速)对话框,并且仍然返回到上一个 viewOrder 对话框。

我的目标是弄清楚如果用户在加速对话框结束时表示他们不想继续,如何清除对话框堆栈。

首先,我尝试让对话框返回 continueDialog bool 值并取消中断函数。但await 只等待对话框开始,而不等待结果,因此中断函数在用户进入加速对话框之前完成。

我更改为仅将新对话框推送到堆栈并处理从加速函数中取消,但 cancelAllDialogs 似乎并没有从这个单独的对话框中取消清除堆栈。

async continueAction(step) {
     if (step.result) {
          return await step.endDialog();
     } else {
          await step.context.sendActivity(`OK, please let me know if there is anything else I can do for you.`);
          return await step.cancelAllDialogs();
     }
}

请注意,“step”只是我的对话框上下文的名称,您可以将其作为“context”、“stepContext”、“dc”、“innerDc”等。

step.result.value 是ConfirmPrompt 的结果,当选择“否”时,我正确地到达了else block 。我希望cancellAllDialogs 清除堆栈,但它似乎只取消事件对话框。

最佳答案

启动新的瀑布对话框时,原始对话框堆栈将成为对话框上下文中的父对话框,因此您需要在取消所有对话框时引用它,即

return await step.parent.cancelAllDialogs();

这将清除整个堆栈。我检查并确认,即使我有多个级别的对话框(例如,我在没有回答提示的情况下调用了加速中断3次),这一行也会清除整个堆栈。

关于botframework - 如何从单独的瀑布对话框中取消所有对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57994846/

相关文章:

c# - 无论 KB 中是否存在匹配项,QnA Api 都会返回响应代码 200 OK

c# - 如何在 Microsoft Bot Framework 中的对话框之间传递对象?

node.js - 在机器人框架 v4 Nodejs 中发送之前拦截机器人消息

c# - 如何在继承DialogContainer的类中进行依赖注入(inject)?机器人框架 v4

node.js - Microsoft BotBuilder node.js : How to send formatted text (BOLD , 斜体(换行))到 Android Skype for Business 客户端(从 Bot)

node.js - 使用 Nodejs 将对话记录到 Azure CosmosDB

node.js - 如何将对话引用(字典)存储到Azure DB存储中

node.js - 如何使用dialogflow-nodejs-client-v2将Dialogflow API v2与MS BotFramework集成

botframework - MS Teams Bot Framework : Adaptive card Input. 本地化时的日期格式问题与英语不同

c# - 在 QnA azure 机器人中嵌入链接