【问题标题】:How to cancel all dialogs from within a separate waterfall dialog如何从单独的瀑布对话框中取消所有对话框
【发布时间】:2019-09-19 01:00:24
【问题描述】:

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

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

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

起初我尝试让对话框返回一个 continueDialog 布尔值并从中断函数中取消。但是 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 块。我希望 cancelAllDialogs 清除堆栈,但它似乎只取消活动对话框。

【问题讨论】:

    标签: botframework


    【解决方案1】:

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

    return await step.parent.cancelAllDialogs();
    

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

    【讨论】:

    • 如果这回答了你的问题,那么请接受它作为你的答案
    • SO 需要 2 天才能接受自己的答案。我会尽快这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2019-05-30
    相关资源
    最近更新 更多