Интервал опроса прямой линии Azure BotFramework вызывает непрерывный запуск событий - PullRequest
0 голосов
/ 20 июня 2019

В настоящее время я разрабатываю прототип для обмена данными между элементами чата и веб-сайта.Я использую бот-сервисы Azure BotFrameworkAdapter и DirectLine для связи между двумя приложениями.

У меня возникла проблема, которую я сузил до свойства pollingInterval объекта DirectLine.Документация гласит:

Clients that poll using HTTP GET should choose a polling interval that matches their intended use.

Service-to-service applications often use a polling interval of 5s or 10s.

Client-facing applications often use a polling interval of 1s, and issue a single additional request shortly after every message that the client sends (to rapidly retrieve a bot's response). This delay can be as short at 300ms but should be tuned based on the bot's speed and transit time. Polling should not be more frequent than once per second for any extended period of time.

Насколько я понимаю, именно так объект DirectLine получает события от бота, однако мне нужно, чтобы событие вызывалось только один раз, а не на интервале опроса.Кажется, что нет никакого способа сказать «Я закончил с этим событием» и двигаться дальше.Как только он запускается один раз, он запускается непрерывно, что вызывает проблемы с функциональностью приложения.

У меня есть этот объект BotConnection, который используется для создания экземпляра DirectLine и подписки обработчиков событий на полученные события:

import { DirectLine } from 'botframework-directlinejs';
export default class BotConnection {
    constructor() {
        //Connect to directline object hosted by the bot
        this.connection = new DirectLine({
            domain: 'http://localhost:3001/directline',
            pollingInterval: 1000,
            webSocket: false
        })
    }
    getConnection() {
        return this.connection;
    }
    subscribeEventHandler(name, handle) {
        console.log('subscribeEventHandler');
        this.connection.activity$
        .filter(activity => activity.type === "event" && activity.name === name)
        .subscribe(activity => handle(activity));
    }
}

Я реализую класс botConnection в своем файле приложения следующим образом:

props.botConnection.subscribeEventHandler('changePage', () => console.log('test'));

Мой файл Bot принимает сообщение и отправляет на страницу событие, которое должно быть обработано один раз.в клиентском приложении:

const { ActivityHandler } = require('botbuilder');

class MyBot extends ActivityHandler {
    constructor() {
        super();
        this.onMessage(async (context, next) => {
            //Testing directline back-channel functionality
            if(context.activity.text === "Change page") {
                await context.sendActivity({type: 'event', name: 'changePage', value: '/test'});
            }
        await next();
     }
}

Any help with this issue would be fantastic. I am unsure if there is something supported by Azure or if there is some custom magic that I need to do.

Thanks
...