javascript - 聊天准备好后回调
问题描述
我正在使用 Microsoft Bot Framework 构建 ChatBot 服务,将 Azure 作为服务,并使用 QnA Maker 构建键值对。
在我们的实现中,我们使用 Azure 将所有内容完全托管在云中,因此,我们无法访问该框架的任何代码隐藏。这一切都是通过网页在 JS 中完成的。没有我们可以从后端推送的“卡片”或特殊的“接口”。因此,我不得不实现一些“hack”,我已经实现了自己的 JS 功能,当页面加载时,它会代表用户发送一条消息以触发 QnA Maker 响应.
我遇到的问题是,即使 DOM 可能已经准备好,ChatBot 实现和后端服务可能还没有!它可能仍处于“正在连接...”或加载状态,因此,当我的 JS 尝试发送消息时,它根本不会触发,因为发送消息的按钮在服务就绪之前被禁用。这部分全部由机器人框架控制。因此,在某些实例中(通常是当天的第一个实例或一段时间后的第一个实例),消息“嗨!我有一个问题...”仍保留在“用户聊天栏”中,并且永远不会火灾。
这是我的问题:有没有办法让机器人框架在准备好接收输入后执行回调?如果是这样,我会将回调放在 JS 实现中的什么位置?或者,在触发发送事件之前,我怎么能“等到按钮启用”?
如果不清楚或者您需要更多信息,请告诉我。
更新
验证后,当聊天机器人连接到服务时,甚至不会禁用该按钮,因此即使该选项也不可用。回调似乎是实现这一目标的唯一可能方法?
更新->解决方案! 如果有人想知道如何做到这一点,这里有一个工作示例,向您展示了具体方法。这是从 BotFramework 的不同 GitHub 说明页面合并而来的,Steven Kanberg 在下面的评论中提供了这些说明。谢谢!
//This is how you build your store, and load the web chat... StyleOptions is a constant that is up to you to create.
const token = 'ENTER YOUR SECRET HERE';
const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => {
if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
const event = new Event('webchatreadyactivity');
event.data = action.payload.activity;
window.dispatchEvent(event);
// When we receive DIRECT_LINE/CONNECT_FULFILLED action, we will send an event activity using WEB_CHAT/SEND_EVENT
dispatch({
type: 'WEB_CHAT/SEND_EVENT',
payload: {
name: 'webchat/join',
value: { language: window.navigator.language }
}
});
}
return next(action);
});
window.WebChat.renderWebChat({
directLine: window.WebChat.createDirectLine({ token }),
store,
styleOptions
}, document.getElementById("ENTER CHAT ELEMENT ID HERE"));
//THEN, simply hook onto the event like this, to send your initial message...
//This event will fire only ONCE, and only once the chat is READY.
window.addEventListener('webchatreadyactivity', ({ data }) => {
//this is yours to build as well...
sendWelcomeMessage();
});
解决方案
推荐阅读
- apache-spark - spark streaming kafka:为主题分区获取数据时出现未知错误
- r - 使用 dplyr 应用函数后,将输出作为列而不是列表返回
- javascript - 使用自定义组件反应树视图
- android - 从开始时间起 6 小时后自动停止定位服务
- asp.net - C# MemoryCache 是否持续存在于 IIS 应用程序池空闲超时
- c# - 为什么 POST 使用 Webrequest 总是失败但使用 html 表单是成功的?
- spreadsheet - Google电子表格条件格式行取决于当前工作表和另一张工作表上的日期
- c++ - OpenCV C++ 在彩色图像中组合灰度图像
- php - 如果可能的话,如何将仪表板按钮移动到网站菜单
- javascript - 服务器端 DataTable JS clear() 不工作