如何防止在Microsoft Bot Builder SDK中执行beginDialogAction和triggerAction

时间:2018-01-27 05:17:31

标签: node.js botframework

注意:我在Node.js中使用Microsoft Bot Builder的SDK。

期望的任务

我正在尝试使用beginDialogAction启动另一个子对话框,以便在子对话框对话框结束时,堆栈将返回到它们停止的对话框。但是,与此同时,我希望为用户提供选项,以便在任何其他对话中将此相同的子对话框激活为triggerAction。

问题

如下所示通过triggerAction和beginDialogAction将子对话框的两个COPIES放入堆栈中。这是不需要的行为,因为一旦其中一个对话框完成,该对话框的副本就会再次运行。

以下是代码:

// user dialog
bot.dialog('/', [
    function (session, args, next) {
       session.send('Starting root dialog');
    },
    function (session) {
        session.send('Ending root dialog.');
]).beginDialogAction('addUser', 'UserAdd', {
    matches: /^user add$/i
});

// branch dialog
bot.dialog('UserAdd', [
    function (session, args, next) {
        session.send('Adding user.');
}
]).triggerAction({
    matches: /^user add$/i
})

问题

启用对话框的beginDialogAction和triggerAction的正确方法是什么,但是如果它由beginDialogAction触发,则只运行该对话框ONCE,以便root对话框可以从中断处继续?如果这不是传统的思维方式来使用这个框架,我欢迎其他观点。

1 个答案:

答案 0 :(得分:1)

  

这是不需要的行为,因为一旦其中一个对话框完成,该对话框的副本就会再次运行。

我无法重现此问题。您的代码中的问题是,在UserAdd对话框被beginDialogActiontriggerAction调用后,您没有结束UserAdd对话框,这使得对话框堆栈始终保持在此对话框中beginDialogAction对话框,永不结束。

根据您的说明,我认为triggerActionbot.dialog('/', [ function (session, args, next) { session.send('Starting root dialog'); builder.Prompts.text(session, "How many people are in your party?"); }, function (session, results) { builder.Prompts.text(session, "Who will be there?"); }, function (session, results) { session.send('Ending root dialog.'); session.endDialog(); } ]) .beginDialogAction('addUser', 'UserAdd', { matches: /^user add$/i }) // // branch dialog bot.dialog('UserAdd', [ function (session, args, next) { session.send('Adding user.'); session.endDialog(); } ]).triggerAction({ matches: /^user add$/i }); 之间不会有任何冲突,尝试修改您的代码如下,并且它在我身边正常工作:

{{1}}

如果有任何进一步的问题或更多问题,请随时发表评论。