【问题标题】:How to send 2 events one after the other with botframework webchat?如何使用 botframework 网络聊天一个接一个地发送 2 个事件?
【发布时间】:2019-07-29 16:33:02
【问题描述】:

我自定义了 BotFramework 网络聊天以向我的机器人发送 2 个事件。 第一个是用于 RGPD,我们提醒用户保存哪些信息以及用于什么目的。第二个是“问候”消息(机器人说“Hi ...”)。

但是使用 dispatch 方法,两个事件几乎同时发送,有时,网络聊天首先显示问候消息,这不是我所期望的。

这是示例。

createStore({}, function (_ref) {
        var dispatch = _ref.dispatch;
        return function (next) {
            return function (action) {
                 if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
                    dispatch({
                        type: 'WEB_CHAT/SEND_EVENT',
                        payload: {
                            name: 'rgpd',
                            type: 'event'
                        }
                    });

                    dispatch({
                            type: 'WEB_CHAT/SEND_EVENT',
                            payload: {
                                name: 'greeting',
                                type: 'event'
                            }
                        });
                 }
            }
        }
}

那么我怎样才能总是在 rgpd 事件之后发送问候事件呢?

我尝试使用简单的window.setTimeout,但这不是一个好的解决方案,因为我不知道directline 需要多少时间来处理第一次调用,结果和以前一样。

有什么想法吗? 谢谢

【问题讨论】:

    标签: javascript botframework web-chat


    【解决方案1】:

    我建议调度一个事件并从机器人发送两个活动。

    Bot Framework SDK v4(节点)

    this.onEvent(async (context, next) => {
      if (context.activity.name === 'webchat/join') {
        await context.sendActivities([{ text: 'General Data Protection Regulation' }, { text: 'Backchannel Welcome Message sent from `onEvent`!' }]);
      }
      await next();
    });
    

    网络聊天 v4 - 存储中间件

    const store = createStore(
      {},
      ({ dispatch }) => next => async action => {
        if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') { 
        dispatch({
          type: 'WEB_CHAT/SEND_EVENT',
          payload: {
            name: 'webchat/join'
          }
        });
      } 
      return next(action)
    });
    

    截图

    【讨论】:

    • 谢谢。只发送一个事件,然后用 2 个活动处理它是最好的解决方案。
    【解决方案2】:

    我建议查看Javascript promises,因为它们旨在解决异步任务的问题。 herehere 有一些很棒的文章。

    类似于以下内容:

    if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
      new Promise(function() {
        dispatch({
            type: 'WEB_CHAT/SEND_EVENT',
            payload: {
                name: 'rgpd',
                type: 'event'
            }
        });
      }).then(function() {
        dispatch({
          type: 'WEB_CHAT/SEND_EVENT',
          payload: {
              name: 'greeting',
              type: 'event'
          }
        });
      });
    }
    

    【讨论】:

    • 我试过了,但是 dispatch 方法只是发送消息而不听服务器的响应。我的所有活动现在都在同一秒发送,但第一个总是最后一个收到回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    相关资源
    最近更新 更多