【问题标题】:Javascript: Always returns undefined values after calling a function [duplicate]Javascript:调用函数后总是返回未定义的值[重复]
【发布时间】:2017-04-25 04:45:42
【问题描述】:
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) 时,它会显示一个空数组。

我真的对函数的执行顺序感到困惑。如果我想确保 var 信息在传递给 initMap() 之前完成,该怎么办?

【问题讨论】:

  • 您在将数据推送到信息数组时是否调试过响应?该 ajax 调用是否返回任何响应数据?该 ID.json 是否返回任何数据?
  • function loadData() { d3.json('data/res/ID.json', function (error, d) { var ids = d.ids; var info = []; d.ids.forEach(function (id, i) { d3.json('data/res/json/' + id + '.json', function (error, d) { info.push({ "id": id, "value": d }) }) }); console.log(ids, info); }); }
  • 有两种类型的 javascript 程序员。另一个没有。懂异步代码的人,
  • @JaromandaX:我喜欢那个:D

标签: javascript arrays function d3.js undefined


【解决方案1】:

似乎数据在回调中被异步推送到 info,而 initMap 在 d.ids.forEach 之后被同步调用。换句话说,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);
        })
    });

【讨论】:

  • 这真的很有帮助!我的代码现在可以工作了!谢谢!我只是 Javascript 的初学者。似乎回调是异步执行中必须的。
猜你喜欢
  • 1970-01-01
  • 2020-11-15
  • 2013-07-01
  • 2013-06-26
  • 2014-03-05
  • 2021-04-11
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
相关资源
最近更新 更多