Bot Framework: как добавить шаг подтверждения пользователя в CancelAndHelpDialog

Я хотел бы попросить пользователя подтвердить, прежде чем фактически отменить все диалоги. В текущем примере кода диалоги отменяются, как только пользователь вводит отмену или выход. Любые предложения, как это сделать?

    async interrupt(innerDc) {
        if (innerDc.context.activity.text) {
            const text = innerDc.context.activity.text.toLowerCase();

            switch (text) {
            case 'help':
            case '?': {
                const helpMessageText = 'Show help here';
                await innerDc.context.sendActivity(helpMessageText, helpMessageText, InputHints.ExpectingInput);
                return { status: DialogTurnStatus.waiting };
            }
            case 'cancel':
            case 'quit': {
                const cancelMessageText = 'Cancelling...';
                await innerDc.context.sendActivity(cancelMessageText, cancelMessageText, InputHints.IgnoringInput);
                return await innerDc.cancelAllDialogs();
            }
            }
        }
    }
}

Можете ли вы дать ссылку на образец, на который вы ссылаетесь?

Kyle Delaney 14.12.2020 23:10

Где мои манеры. Добавлена ​​ссылка на образец основного бота.

Hessel 15.12.2020 12:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
164
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Глядя на пример Core Bot, вы можете видеть, что CancelAndHelpDialog — это диалог компонента, что означает, что у него есть собственный набор диалогов, к которому мы можем добавлять диалоги. В вашем случае вам понадобится запрос подтверждения и диалоговое окно водопада. Вы можете использовать BookingDialog в качестве руководства по реализации этого, потому что он расширяет CancelAndHelpDialog и, следовательно, расширяет ComponentDialog.

Вы можете видеть, что BookingDialog добавляет внутренние диалоги к набору диалогов в своем конструкторе:

constructor(id) {
    super(id || 'bookingDialog');

    this.addDialog(new TextPrompt(TEXT_PROMPT))
        .addDialog(new ConfirmPrompt(CONFIRM_PROMPT))
        .addDialog(new DateResolverDialog(DATE_RESOLVER_DIALOG))
        .addDialog(new WaterfallDialog(WATERFALL_DIALOG, [
            this.destinationStep.bind(this),
            this.originStep.bind(this),
            this.travelDateStep.bind(this),
            this.confirmStep.bind(this),
            this.finalStep.bind(this)
        ]));

    this.initialDialogId = WATERFALL_DIALOG;
}

Если вы хотите добавить диалоги в набор диалогов в базовом классе CancelAndHelpDialog, вы должны определить для этого конструктор:

constructor(id) {
    super(id);
    
    this.addDialog(new ConfirmPrompt(CANCELLATION_CONFIRMATION))
        .addDialog(new WaterfallDialog(CANCELLATION_WATERFALL, [
            async stepContext => await stepContext.prompt(CANCELLATION_CONFIRMATION, 'Are you sure you want to cancel?'),
            async stepContext => {
                if (stepContext.result) {
                    const cancelMessageText = 'Cancelling...';
                    await stepContext.context.sendActivity(cancelMessageText, cancelMessageText, InputHints.IgnoringInput);
                    return await stepContext.cancelAllDialogs();
                }

                return stepContext.endDialog();
            },
        ]));
}

Обратите внимание, что, поскольку CancelAndHelpDialog предназначен для использования в качестве базового класса, он будет делиться своим набором диалогов с любым классом, который его расширяет. Это означает, что вам нужно убедиться, что нет никаких идентификаторов диалога, которые он имеет вместе с классами, которые его расширяют. Например, вы можете видеть, что BookingDialog уже использует идентификаторы 'confirmPrompt' и 'waterfallDialog':

const CONFIRM_PROMPT = 'confirmPrompt';
const DATE_RESOLVER_DIALOG = 'dateResolverDialog';
const TEXT_PROMPT = 'textPrompt';
const WATERFALL_DIALOG = 'waterfallDialog';

Это означает, что вы не можете использовать эти строки в качестве идентификатора для запроса подтверждения и диалогового окна водопада, которые вы создаете в CancelAndHelpDialog. Вот строки, которые я использую вместо этого:

const CANCELLATION_CONFIRMATION = 'cancellationConfirmation';
const CANCELLATION_WATERFALL = 'cancellationWaterfall';

Также обратите внимание, что я использую анонимные стрелочные функции в качестве каскадных шагов, но если вы хотите использовать именованные функции, такие как BookingDialog, вам нужно придумать имена функций, которые не конфликтуют с функциями в классах, которые расширяют CancelAndHelpDialog, как и в случае с идентификаторами диалогов. Так, например, поскольку BookingDialog содержит функцию с именем confirmStep, вы не должны использовать это имя в качестве имени вашей функции, которая вызывает запрос подтверждения в CancelAndHelpDialog.

Вы можете заметить, что второй шаг в определенном мной диалоговом окне водопада содержит код, который почти идентичен второму варианту переключения в функции interrupt:

const cancelMessageText = 'Cancelling...';
await innerDc.context.sendActivity(cancelMessageText, cancelMessageText, InputHints.IgnoringInput);
return await innerDc.cancelAllDialogs();

Вам нужно заменить этот код в функции interrupt кодом, который вызывает ваш водопадный диалог:

return await innerDc.beginDialog(CANCELLATION_WATERFALL);

спасибо Кайл. Сначала я протестировал его на образце corebot. После изменения «if (stepContext.result.value)» на «if (stepContext.result)» это сработало как шарм. Если это имеет смысл, пожалуйста, отрегулируйте, и я приму ответ. Я также заставил его работать в моем собственном проекте. Ваши замечания о том, что идентификатор диалогового окна должен быть уникальным, объяснили сообщения об ошибках, которые я получил с моим собственным конструктором.

Hessel 16.12.2020 11:09

Я пропустил, что prompt.ts уже извлекает значение из результата распознавателя приглашений.

Kyle Delaney 17.12.2020 20:47

Другие вопросы по теме