我的文件夹中有一些json文件,因此我想通过后端动态访问它们,而无需麻烦地更改数据。
除一件事外,该代码有效
localhost/Foo.json
Prints {Name:Bar} => expected Foo
localhost/Bar.json
Prints {Name:Bar} => expected Bar
因此总是显示数据数组中的最后一个条目
interface filesPath{
name:string,
ext:string, //here .json
filepath:string,
}
var generateJson = (files:filesPath[]) => {
var dataFiles = [];
var dataNames = [];
for(var x in files){
dataFiles[x] = require(files[x].filepath);
dataNames[x] = files[x].name;
app.get('/'+dataNames[x]+files[x].ext,(req, res) => {
res.json(dataFiles[x]) //Returns always last entry in array
});
}
}
有简单的解决方法吗? 预先感谢
答案 0 :(得分:0)
您偶然发现了闭包的概念。发生的事情是,您传递给函数的$('#save-form').click(function () {
$.easyAjax({
url: '{{ route('admin.settings.update', ['1']) }}',
container: '#editSettings',
type: "POST",
data: {
'company_name': $('#company_name').val(),
'company_email': $('#company_email').val(),
'company_phone': $('#company_phone').val(),
'website': $('#website').val(),
'address': $('#address').val(),
'currency_id': $('#currency_id').val(),
'timezone': $('#timezone').val(),
'locale': $('#locale').val(),
'latitude': $('#latitude').val(),
'longitude': $('#longitude').val(),
'_method' : 'PUT',
'_token' : '{{csrf_token()}}'
},
redirect: true,
file: (document.getElementById("logo").files.length != 0 || document.getElementById("login_background").files.length != 0) ? true : false
})
});
不是x
值的副本,而是变量x
本身(有点像指针)。这意味着所有函数共享同一个变量,因此一个变量只能有一个值。
解决此问题的经典方法是将x
作为参数传递,从而破坏了闭包:
x
ES6引入了for(var x in files){
dataFiles[x] = require(files[x].filepath);
dataNames[x] = files[x].name;
app.get('/'+dataNames[x]+files[x].ext,((new_x) => (req, res) => {
res.json(dataFiles[new_x])
})(x)); // <-- pass in x here to become new_x
}
的概念,该概念不会创建闭包。因此,更现代的解决方案是仅使用let
而不是let
:
var