Что определяет, когда «bot.dialog» переходит к следующей функции водопада в Microsoft Bot Framework? (Node.js) - PullRequest
0 голосов
/ 31 октября 2019

Я работаю с Microsoft Bot Framework v3 в компании, которая построила огромную библиотеку поверх нее. Их библиотека не документирована, и мне трудно понять, когда в bot.dialog вы переходите к следующей функции водопада «автоматически» и когда вам нужно вызвать next.

В MS Bot Frameworkтакие вещи, как builder.Prompts.text, будут автоматически передавать результаты следующей функции в водопаде без необходимости вызова next. Например, enter image description here

Есть ли где-то внизу оригинальный код MS Bot Framework, который вызывается каждый раз, когда водопад переходит к следующей функции? Тогда, возможно, я мог бы поместить в этот код оператор трассировки и посмотреть, какие функции их библиотеки вызывают это, а затем автоматически инициировать переход, без необходимости явного вызова next.

Спасибо за любую помощь - яЯ знаю, что эта функция кажется довольно расплывчатой, но я просто оставляю наедине с собой, чтобы понять их библиотеку без документации, и мне неясно, как работают их функции (в отличие от этого, я понимаю, как функционирует оригинальный MS Bot Frameworkработать, потому что есть документация).

1 Ответ

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

Если вы не учитываете псевдо-водопады, созданные с помощью WaterfallDialog.createHandler, то счетчик шагов водопада увеличивается только в WaterfallDialog.dialogResumed, и это только когдапричина возобновления не reprompt или back:

public dialogResumed(session: Session, result: IDialogResult<any>): void {
    let step = session.dialogData[consts.Data.WaterfallStep];
    switch (result.resumed) {
        case ResumeReason.reprompt:
            // Ignore re-prompts
            return;
        case ResumeReason.back:
            step--;
            break;
        default:
            step++;
            break;

    }
    this.doStep(session, step, result);
}

Когда вы говорите о звонке next, я предполагаю, что вы имеете в виду skip. Стоит отметить, что skip сама вызывает dialogResumed:

var skip = (result?: IDialogResult<any>) => {
    result = result || <any>{};
    if (result.resumed == null) {
        result.resumed = ResumeReason.forward;
    }
    this.dialogResumed(session, result);
};

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

Поскольку вы упомянули о желании использовать какой-либо оператор трассировки, нет очевидного места для добавления оператора трассировки в ваш собственный код, которыйбудет выполняться всякий раз, когда водопад переходит к следующему шагу. Однако вы можете использовать WaterfallDialog.onBeforeStep, чтобы включить BeforeWaterfallStepHandler, который выполняется перед обработкой любого шага, независимо от того, является ли он следующим или нет:

export type BeforeWaterfallStepHandler = (session: Session, step: number, args: any, next: (step: number, args: any) => void) => void;

Обратите внимание, что BeforeWaterfallStepHandler включает параметр next, но вызов его просто переходит к следующему обработчику, а не к следующему шагу водопада (хотя вы можете вызывать его с увеличенным значением step).

Помните, что SDK v3 устарел, и всем рекомендуется как можно скорее перейти на v4. Вам будет все труднее получать какую-либо помощь с v3.

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