Botframework 提示对话框直到用户完成

Botframework Prompt dialogs until user finishes

我正在使用 Microsoft 的 botbuilder 和 LUIS 为 slack 创建一个聊天机器人。

有没有办法继续使用 builder.Prompts.text() 继续询问用户是否还有用户想要输入的信息,例如 forwhile 循环?例如,如果有 key 用户想要保存,我想继续询问用户未定义的次数,并且仅在用户键入 done 时停止,然后我将有相同数量的 builder.Prompts.text() 询问用户输入每个键的值。

function (session, results, next) {
  builder.Prompts.text(session, "Another key to put?");
},
function (session, results, next) {
  builder.Prompts.text(session, "Value to put?");
}

我似乎无法使用数组创建某种循环来保存每个键及其值,我不确定如何处理这个问题。

谢谢。

您可以使用 replaceddialog 来循环用户:

bot.dialog("/getUserKeys", [
   function (session, args, next) {
       session.dialogData.keys = args && args.keys ? args.keys : [];
       builder.Prompts.text(session, "Another key to put?");
   },
   function (session, results, next) {
       if (results.response === "none") {
           session.endDialogWithResult({response: { keys: session.DialogData.keys }});
           return;
       }
       session.dialogData.keys[session.dialogData.keys.length] = results.response;
       session.replaceDialog("/getUserKeys", { keys: session.DialogData.keys });
   }
]);

您要查找的是 SDK 的 GitHub 存储库中的 session.replaceDialog(); there is an example labeled 'basics-loops'。要循环提示,必须创建一个带有所需提示的小对话框,并通过 session.replaceDialog()[=36= 自动重新启动对话框]()。

我构建了一个 chatbot 来接收您在上面指定的场景中的键值对。下面的代码摘录是我 'Loop' 对话框中的最后一步。

function (session, results) {
    var value = results.response ? results.response : null,
        key = session.dialogData.key;
    var pairs = session.userData.kVPairs;
    var newPair = {};
    newPair[key] = value;
    if (key && value) {
        session.userData.kVPairs.push(newPair);
        console.log(pairs[pairs.length - 1]);
    }
    session.send('latest key-value pair added, { %s : %s }', key, value);
    session.replaceDialog('Loop');
} 

session.replaceDialog('Loop') 在此瀑布步骤的末尾并入并采用新对话的 Id。该方法还可以采用可选参数传递给新对话框。

注意:虽然这里不适用,replaceDialog 和 beginDialog/endDialog 之间的区别是半明显的,当你使用 beginDialog 时,新对话框被添加到堆栈.当您结束该子对话框时,您将返回到 original/parent 对话框。 replaceDialog 将结束当前对话框并开始新对话框。