我正在将Microsoft Bot Framework与Node.js一起使用。我有一个如下配置文件。
{
"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$"
}
}
}
我想使用一个for循环来阅读并创建对话框,以使它们以text
值响应并具有matches
值的触发动作。
例如,漫游器对hello
的输入hello
,asdf
的输入asdf
和goodbye
的输入作出响应{1}}。
我为解决这个问题而编写的函数看起来像这样。
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")
});
}
}
响应goodbye
,hello
和asdf
的输入。但是,控制台显示应按正确的方式调用正确的对话框。即使当我使用goodbye
调用hello
对话框时,机器人也会返回session.beginDialog('hello');
。
什么似乎是导致问题的原因?
答案 0 :(得分:5)
这是JavaScript中var
的常见“陷阱”。将var
替换为let
应该可以解决您的问题。
与
类似的问题
for (var i = 0; i < 10; i++) {
setTimeout(function() { console.log(i); }, 100 * i);
}
根本原因是var
是作用域,而let
是块作用域。您可以参考https://www.typescriptlang.org/docs/handbook/variable-declarations.html了解详情。