Я реализую dialogRootBot, который будет вызывать skillDialogBot.
Мой dialogRootBot может вызывать skillDialogBot. Разговор может продолжаться до момента, когда skillDialogBot должен вернуть результаты в dialogRootBot.
SkillDialogBot имеет следующие настройки:
this.addDialog(new TextPrompt(TEXT_PROMPT))
.addDialog(new ConfirmPrompt(CONFIRM_PROMPT))
.addDialog(new WaterfallDialog(WATERFALL_DIALOG, [
this.processStep.bind(this)
]));
processStep выглядит следующим образом
async processStep(stepContext) {
const details = stepContext.options;
details.result = {
status: 'success'
};
return await stepContext.endDialog(stepContext.options);
}
Я ожидал, что dialogRootBot получит результат от skillDialogBot после того, как processStep вызвал endDialog, но этого никогда не происходит. Вместо этого пользователь застревает в skillDialogBot до тех пор, пока пользователь вручную не наберет "abort", то есть команду, которую dialogRootBot отслеживает для отмены всех диалогов в своей реализации onContinueDialog ().
Вот как onContinueDialog () выглядит как
async onContinueDialog(innerDc) {
const activeSkill = await this.activeSkillProperty.get(innerDc.context, () => null);
const activity = innerDc.context.activity;
if (activeSkill != null && activity.type === ActivityTypes.Message && activity.text) {
if (activity.text.toLocaleLowerCase() === 'abort') {
// Cancel all dialogs when the user says abort.
// The SkillDialog automatically sends an EndOfConversation message to the skill to let the
// skill know that it needs to end its current dialogs, too.
await innerDc.cancelAllDialogs();
return await innerDc.replaceDialog(this.initialDialogId, { text: 'Request canceled!' });
}
}
return await super.onContinueDialog(innerDc);
}
Я смоделировал это по образцу botbuilder-samples \ samples \ javascript_nodejs \ 81.skills-skilldialog. Если бы я изменил skillDialogBot и заставил его выполнить ConfirmPrompt () перед endDialog () finalStep (), то разговор завершился бы правильно, когда skillDialogBot () отправит результаты диалога в rootDialogBot.
Для ясности, вот как выглядит bookingDialog в примере skills-skilldialog
/**
* Confirm the information the user has provided.
*/
async confirmStep(stepContext) {
const bookingDetails = stepContext.options;
// Capture the results of the previous step.
bookingDetails.travelDate = stepContext.result;
const messageText = `Please confirm, I have you traveling to: ${ bookingDetails.destination } from: ${ bookingDetails.origin } on: ${ bookingDetails.travelDate }. Is this correct?`;
const msg = MessageFactory.text(messageText, messageText, InputHints.ExpectingInput);
// Offer a YES/NO prompt.
return await stepContext.prompt(CONFIRM_PROMPT, { prompt: msg });
}
/**
* Complete the interaction and end the dialog.
*/
async finalStep(stepContext) {
if (stepContext.result === true) {
const bookingDetails = stepContext.options;
return await stepContext.endDialog(bookingDetails);
}
return await stepContext.endDialog();
}
Нельзя ли завершить диалог endDialog () без приглашения? Почему мой skillDialogBot не может завершить диалог и передать результаты rootDialogBot?
Спасибо