我有用于查看订单和加急订单的对话框。用户可能希望在 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/