Вам нужно вызывать endDialog для каждого beginDialog в Microsoft Bot Framework? Когда следует вызывать endDialog? - PullRequest
0 голосов
/ 04 ноября 2019

EDIT:

Проходя по исходному коду, я нашел следующее в botbuilder.d.ts. Казалось бы, в водопадах вам не нужно называть endDialog явно?

/* You can terminate a waterfall early by either falling through every step of the waterfall using
 * calls to `skip()` or simply not starting another prompt or dialog.
 *
 * __note:__ Waterfalls have a hidden last step which will automatically end the current dialog if
 * if you call a prompt or dialog from the last step. This is useful where you have a deep stack of
 * dialogs and want a call to [session.endDialog()](/en-us/node/builder/chat-reference/classes/_botbuilder_d_.session.html#enddialog)
 * from the last child on the stack to end the entire stack. The close of the last child will trigger
 * all of its parents to move to this hidden step which will cascade the close all the way up the stack.
 * This is typically a desired behavior but if you want to avoid it or stop it somewhere in the
 * middle you'll need to add a step to the end of your waterfall that either does nothing or calls
 * something like [session.send()](/en-us/node/builder/chat-reference/classes/_botbuilder_d_.session.html#send)
 * which isn't going to advance the waterfall forward.
 * @example
 * <pre><code>
 * var bot = new builder.BotConnectorBot();
 * bot.add('/', [
 *     function (session) {
 *         builder.Prompts.text(session, "Hi! What's your name?");
 *     },
 *     function (session, results) {
 *         if (results && results.response) {
 *             // User answered question.
 *             session.send("Hello %s.", results.response);
 *         } else {
 *             // User said never mind.
 *             session.send("OK. Goodbye.");
 *         }
 *     }
 * ]);
 * 
* /

Я изучаю MS Bot Framework версии 3 - это версияони работают здесь.

Я следую концепции работы водопадов (https://docs.microsoft.com/en-us/azure/bot-service/nodejs/bot-builder-nodejs-dialog-manage-conversation-flow?view=azure-bot-service-3.0),, но я не понимаю, какую роль играет endDialog.

Например, в коде, который мыработают, есть несколько отдельных диалогов, которые имеют форму

module.exports = function showTickets() {
    this.bot.dialog('/showAllTickets', [
        async function showAllTicketsFn(session, args, next) {
            this.beginDialog.bind(this, '/showTickets')(session, args, next);
        }.bind(this)
    ]);
};

В основном одно диалоговое окно загружает другое (с некоторым другим промежуточным кодом, таким как установка данных в хранилище данных). 1020 *. Но в примере из учебного пособия по MS каждый водопад оканчивается некой формой endDialog (endDialog или endDialogWithResults и т. Д.).

Каждый диалог «открывается» с помощью beginDialog автоматически «закрывает» себя, когда его водопад завершен, то есть когда функции, которые передаются в массиве в bot.dialog, выполняются через? (в приведенном выше коде водопад - только один шаг).

Когда нужно явно позвонить endDialog?

Спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Действительно, в документации должно быть сказано, что вы должны завершить диалог, а не то, что вы должны . Водопады прекратятся автоматически, если вы не позвоните EndDialog явно. Предполагается, что это скорее встроенный механизм безопасности, помогающий избежать застревания пользователя, забыв вызвать enddialog после получения результата. Но есть случаи, когда все нормально, не добавляйте явный вызов EndDialog. Вы можете найти больше в водопаде здесь .

В одном допустимом случае использования диалоговый вызов - это водопад, который просто решает, к какому диалогу он хочет перейти. После его перехода к данному диалогу нет никаких оснований добавлять шаг, который заканчивается после окончания этого диалога.

Но, вероятно, даже в этом случае более эффективно просто использовать ReplaceDialog, чтобы заменить себя диалогомвы переходите на.

1 голос
/ 04 ноября 2019

Эй, мне самому это интересно, и я нашел это по MS

Диалог, созданный с использованием водопада, должен быть явно завершен, иначе бот будет повторять водопад бесконечно. Вы можете остановить водопад, используя один из следующих методов:

session.endDialog: Используйте этот метод, чтобы завершить водопад, если нет данных для возврата в диалог вызова.

сеанс. endDialogWithResult: используйте этот метод, чтобы завершить водопад, если есть данные для возврата в диалог вызова. Возвращаемый аргумент ответа может быть объектом JSON или любым примитивным типом данных JavaScript.

Диалоговое окно завершения водопада Bot Framework

Если вы хотите завершить все диалоги и прекратить разговор, вы можете использовать триггер endConversationAction с дополнительным сообщением/ объект

this.bot.dialog('/showAllTickets', [
    async function showAllTicketsFn(session, args, next) {
        this.beginDialog.bind(this, '/showTickets')(session, args, next);
        session.endConversation();
    }.bind(this)
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...