var info = [];
var data = [];
var ids;
function loadData() {
d3.json('data/res/ID.json', function (error, d) {
ids = d.ids;
d.ids.forEach(function (id, i) {
d3.json('data/res/json/' + id + '.json', function (error, d) {
info.push({
"id": id,
"value": d
})
})
});
initMap(ids, info);
});
}
我只是想从几个csv文件中读取并在var info中创建一个对象数组。然后我想将数组传递给一个名为initMap()的函数。但是,当我在initMap()中的console.log(info)时,它显示一个空数组。
我对函数执行的顺序感到困惑。如果我想确保在传递给initMap()之前完成var info,该怎么办?
答案 0 :(得分:0)
似乎数据在回调中异步推送到信息,而在d.ids.forEach之后立即同步调用initMap。换句话说,d.ids.forEach计划将数据推送到info,并在执行计划的操作之前调用initMap。
您需要跟踪d3.json('data/res/json/' + id + '.json'
回调执行(即使用计数器)并在执行所有回调后触发initMap。
它可能看起来像(未经测试,只是试图反映这个想法):
var itemsAmount = d.ids.length;
var cbExecuted = 0;
d.ids.forEach(function (id, i) {
d3.json('data/res/json/' + id + '.json', function (error, d) {
info.push({
"id": id,
"value": d
});
if (++cbExecuted === itemsAmount) initMap(ids, info);
})
});