Как определить конец диалога в Botframework v4? - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь запустить диалог обратной связи после завершения любого другого диалога в системе. Я нашел этот ответ , в котором говорится, что нужно использовать onEndDialog, но это не является допустимой функцией в ActivityHandler, только onDialog. Мой "главный диалог" находится в боте. js расширение ActivityHandler, поэтому я не расширяю ComponentDialog. Учитывая, как это настроено, есть ли способ определить, когда диалог закончился? Я попытался проверить стек диалогов в onDialog, но он не читает диалоговое окно с приветственным сообщением и исходным сообщением от пользователя, а после этого всегда читает как запущенный диалог. Есть ли способ, которым я могу изменить свой обработчик функций / ботов, чтобы обнаружить событие окончания диалога? Вот функция onDialog, которую я пробовал.

        this.onDialog(async (context, next) => {
            const currentDialog = await this.dialogState.get(context, {});
            if (currentDialog.dialogStack) {
                console.log('Dialog is running');
            } else {
                console.log('Dialog is not running');
            }

            // By calling next() you ensure that the next BotHandler is run.
            await next();
        });

Я рассмотрел добавление дополнительного шага в конец каждого диалога для вызова диалога обратной связи (вероятно, через replaceDialog), но я не уверен, что будет лучшей практикой.

1 Ответ

1 голос
/ 29 января 2020

Это точно не может быть сделано, поскольку endDialog не всплывает из-за чего-либо доступного из ActivityHandler (насколько я знаю).

Но для обходного пути вы так близко! Измените его на что-то вроде этого:

this.onDialog(async (context, next) => {
    const currentDialog = await this.dialogState.get(context);
    if (currentDialog === undefined) {
        console.log('No dialogs started');
    } else if (currentDialog.dialogStack && currentDialog.dialogStack.length > 0) {
        console.log('Dialog is running');
    } else {
        console.log('Dialog is not running');
    }

    // By calling next() you ensure that the next BotHandler is run.
    await next();
});

Ваш не совсем работал, только потому что currentDialog устанавливается на {}, если он не существует, что является правдой, поэтому мы должны проверить, если в dialogStack есть что-нибудь с currentDialog.dialogStack.length > 0.

currentDialog, равное undefined, если диалог еще не начался, поэтому currentDialog === undefined или !currentDialog допускают исходные и приветственные сообщения. Наличие этих трех отдельных ветвей должно позволить вам справиться с каждой ситуацией.


Что касается "лучших практик", я бы сказал, что это подход правильный , если вы хотите получить обратную связь в конце каждый диалог. Если есть любой , для которого вы не хотите получать обратную связь, лучше всего вызвать ваш FeedbackDialog в конце соответствующих диалогов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...