javascript - 带参数的JS中的闭包
问题描述
我有一个像这样的对象
JSON_DATA = {
"EVENT" : "data/sequence/sequenceEvent.json",
"CHAT" : "data/sequence/sequenceChat.json",
}
我想加载这些值,所以我这样做
LoadJSON(JSON_DATA, function(data){
var DATA = data;
});
function LoadJSON(jsons, callback){
var counterLoaded = 0;
var counterToLoad = Object.keys(jsons).length;
var parsedData = {};
for(var key in jsons){
ajax.get(jsons[key], "", function(data){
parsedData[key] = JSON.parse(data);
counterLoaded++;
if(counterLoaded == counterToLoad){
callback(parsedData);
}
}, true)
}
}
现在,我知道我有一个关闭问题,就像 key 总是最后一个。
但是,我在互联网上搜索,并期待一个 setTimeOut 或这样的功能
function LoadJSON(jsons, callback){
var counterLoaded = 0;
var counterToLoad = Object.keys(jsons).length;
var parsedData = {};
for(var key in jsons){
ajax.get(jsons[key], "", (function(key){
parsedData[key] = JSON.parse(data);
counterLoaded++;
if(counterLoaded == counterToLoad){
callback(parsedData);
}
})(key), true)
}
}
它不起作用,但在我的问题中,我还需要传递参数数据。
我怎样才能做到这一点?
解决方案
关键永远是最后一个。
选项 1:使用闭包。
for (var key in jsons) {
(function(k) {
ajax.get(jsons[k], "", function(data) {
parsedData[k] = JSON.parse(data);
counterLoaded++;
if (counterLoaded == counterToLoad) {
callback(parsedData);
}
}, true);
})(key);
}
选项 2:使用 Promise API。
推荐阅读
- tensorflow - 向 Google 云提交 Keras 培训作业
- google-drive-api - 过滤新修改的文件不返回新文件
- influxdb - 如何找到每天记录的最高温度
- javascript - 检测浏览器是否已经在加载另一个页面
- swiftui - SwiftUI UIViewRepresentable UITextView 绑定
- python - 数组的随机洗牌,但保持对角线固定
- python - 为列中的所有值重塑数据框
- typescript - 区分联合类型
- vba - 如何选择表底部与今天日期匹配的所有行
- sql-server - 如何清除sqlserver缓存以获得正确的执行计划