Javascript:调用函数后始终返回未定义的值

时间:2017-04-25 04:45:43

标签: javascript arrays function d3.js undefined

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,该怎么办?

1 个答案:

答案 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);
        })
    });