以编程方式从JSON文件创建对话框

Jus*_*ang 1 azure node.js botframework

我在Node.js上使用Microsoft Bot Framework.我有一个如下所示的配置文件.

{
  "server": {
    "port": 3978
  },
  "dialogs": {
    "default": {
      "text": "This is some sample text.",
      "actions": [
        {
          "title": "Button 1",
          "value": "Action 1"
        },
        {
          "title": "Button 2",
          "value": "Action 2"
        }
      ]
    },
    "hello": {
      "text": "hello",
      "matches": "^hello$"
    },
    "asdf": {
      "text": "asdf",
      "matches": "^asdf$"
    },
    "goodbye": {
      "text": "goodbye",
      "matches": "^goodbye$"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想使用for循环来读取对话框并创建它们,以便它们响应text值并具有值的触发器操作matches.

例如,机器人响应hello输入hello,asdf输入asdfgoodbye输入goodbye.

我试图解决这个问题的函数看起来像这样.

var create = function(bot, _config) {
  var config = JSON.parse(JSON.stringify(_config));

  // Create dialogs from config
  var keys = Object.keys(config.dialogs);
  for(var i = 0; i < keys.length; i++) {
    var dialogName = keys[i];
    var dialog = config.dialogs[dialogName];
    // Skip over default dialog
    if(dialogName == "default") continue;
    // Create other dialogs
    bot.dialog(dialogName, function(session) {
      var text = dialog.text;
      session.endDialog(text);
    }).triggerAction({
      matches: new RegExp(dialog.matches, "i")
    });
  } 
}
Run Code Online (Sandbox Code Playgroud)

当我运行此,机器人与响应goodbye到输入hello,asdf以及goodbye.但是,控制台显示正确的对话框应该被调用.即使我hello通过使用调用对话框session.beginDialog('hello');,机器人也会返回goodbye.

什么似乎导致这里的问题?

Gar*_*SFT 5

这是varjavascript中常见的"陷阱" .替换varlet应该解决您的问题.

问题类似于

for (var i = 0; i < 10; i++) {
    setTimeout(function() { console.log(i); }, 100 * i);
}
Run Code Online (Sandbox Code Playgroud)

根本原因是var函数作用域并且let是块作用域的.有关详细信息,请参阅https://www.typescriptlang.org/docs/handbook/variable-declarations.html.