javascript - Bot 框架范围 beginDialogAction
问题描述
我在使用 beginDialogAction 方法来控制对话流时遇到了一些问题,希望得到一些建议。我对 JavaScript 很陌生。
我想做的是将关键字匹配到我的主对话框的上下文中。我的理解是 beginDialogAction 方法是最好的方法。我的问题是,一旦使用 beginDialogAction 触发了我的对话框,新对话框就会添加到堆栈中,并且 beginDialogAction 会继续侦听另一个匹配项。这意味着如果我的用户碰巧在流程中匹配我的触发词,它将改变谈话的主题。
我想要的是在开始 beginDialogAction 中指定的新对话框之前清除对话框堆栈,但我一直无法弄清楚到目前为止。任何建议将不胜感激!
代码:
var bot = new builder.UniversalBot(connector, function (session) {
session.send("Hi, good to meet you! I'm here to help you request services. \n\n Please select an action from below.");
session.beginDialog('main');
});
bot.dialog('main', [
function(session){
var msg = new builder.Message(session);
msg.attachmentLayout(builder.AttachmentLayout.carousel)
msg.attachments([
new builder.HeroCard(session)
.title("Request Design Services")
.subtitle("I can send out a request for any design services you need, right from here!")
.buttons([
builder.CardAction.imBack(session, "I'd like to request design services.", "New Request")
]),
new builder.HeroCard(session)
.title("Project Finacials Request")
.subtitle("I can pull finance information from any project within your organization.")
.buttons([
builder.CardAction.imBack(session, "I'd like to request financials.", "New Request")
])
]);
session.send(msg)
}]).beginDialogAction('begindesign', 'design',{ matches: /design/i }).beginDialogAction('beginfinance', 'finance',{ matches: /financials/i });
bot.dialog('design', [
...
]);
bot.dialog('finance', [
...
]);
解决方案
您可以根据您的要求利用onSelectAction
财产。说明可以参考源码:
/** * (可选)触发操作时调用的自定义处理程序。这使您可以 * 自定义操作的行为。例如,您可以在 * 新对话框启动之前清除对话框堆栈,从而更改默认行为,即仅将新 * 对话框推送到堆栈的末尾。* * 重要的是要注意这不是瀑布,
next()
如果您希望操作默认行为运行,您应该调用。*/
请考虑以下代码片段:
bot.dialog('mainMenu', [
(session, args, next) => {
builder.Prompts.text(session, 'Hi there! What can I do for you today?', {
retryPrompt: 'Hi there! What can I do for you today?'
});
},
(session, results) => {
session.endConversation('Goodbye!');
}
])
.beginDialogAction('sportsAction', 'Sports', {
matches: /^sports$/i,
})
.beginDialogAction('cookingAction', 'Cooking', {
matches: /^cooking$/i,
onSelectAction: (session, args, next) => {
session.clearDialogStack();
next();
}
})
bot.dialog('Sports', [
(session, args, next) => {
session.send(`current dialog length: ${session.sessionState.callstack.length}`);
session.endDialog('Sports here');
}
]);
bot.dialog('Cooking', [
(session, args, next) => {
session.send(`current dialog length: ${session.sessionState.callstack.length}`);
session.endDialog('Cooking here');
}
])
推荐阅读
- amazon-web-services - C# 控制台应用程序的 NLB 运行状况检查失败
- android - 如何在 android 项目中构建模块?
- elasticsearch - ElasticSearch 中的几个字段不同
- javascript - 使用ajax向服务器发送数据的问题
- excel - VBA宏:粘贴在具有可变范围的列中的最后一个单元格下方
- angular - en.json 在角度电子上找不到错误
- javascript - 断点不适用于按钮或 div 元素,但适用于 li 元素
- xpath - 当前视图中的 Xpath 与 inherit_id
- java - 如何从 Activity 类中在 Recycler View Adapters 上设置 OnClick 侦听器?或者从第一个适配器访问其他 RVAdapter?
- shell - 在 Unix Shell 脚本函数中返回负数