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

时间:2019-09-18 14:13:17

标签: botframework

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

在对话框末尾,我提示用户是否要返回上一个对话。如果是,我调用endDialog,它将对话框从堆栈中弹出并返回到上一个对话框。可以了如果否,则调用cancelAllDialogs。我希望这能清除对话框堆栈,但它似乎仅取消当前(快速)对话框,并且仍返回到先前的viewOrder对话框。

我的目标是弄清楚如果用户在快速对话框的末尾说他们不想继续时如何清除对话框堆栈。

起初,我尝试让对话框返回一个continueDialog布尔值并从中断函数中取消。但是await只等待开始对话框,而不等待结果,因此中断功能在用户通过快速对话框之前就完成了。

我更改为只将新对话框推送到堆栈上并处理从expedite函数取消的操作,但是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块。我希望cancellAllDialogs清除堆栈,但似乎只取消了活动对话框。

1 个答案:

答案 0 :(得分:1)

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

return await step.parent.cancelAllDialogs();

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