如何读取Json文件并将一些数据存储在一个数组中,然后在读取文件后再访问它?

时间:2015-08-05 06:56:39

标签: javascript arrays json d3.js

如下面的代码所示,我试图读取Json文件并将一些值从json文件推送到数组中,如果在函数内访问该数组,则值正确存储

但是当回调函数结束时,数组为空 为什么数组不包含推送的值?

var latArray = new Array();
var longArray = new Array();
var getLatLong = d3.json("./SRC/ratp_2013.json", function (error, data){



        for(i in data.stops)
        {
            longArray.push(data.stops[i].longitude);
            latArray.push(data.stops[i].latitude);
        }

        console.log(longArray); //Prints the Array of latitudes
        console.log(latArray);  //Prints the Array of longitudes
});
console.log(longArray); //Prints an empty array.
console.log(latArray);  //Prints an empty array.

5 个答案:

答案 0 :(得分:1)

非常确定是异步电话。

您的控制台是否首先打印空数组,然后打印已填充的数组?

如果是异步通话,那么还应该有一个' onDataLoaded'这一事件。

答案 1 :(得分:1)

由于调用的异步性质,这种情况正在发生。执行程序不会等待响应并从下一行开始执行。您可以在链接中找到更多详细信息:D3 API

因此,在这种情况下,您可以使用以下任一选项获得所需的结果:

  • 在回调函数

  • 中编写代码
  • 使用功能链(即获得回复后,您可以拨打电话 到其他一些函数,并在该函数中编写代码。)

答案 2 :(得分:0)

我猜测d3.json是一个异步函数。

这意味着只要您的d3.json函数触发,console.log函数也会触发。他们都被一起解雇了。

因此,在阅读文件时,您会调用console.log个。

你可以:

  1. 使用回调内部的数据。
  2. 创建Promise(ES6)...
  3. var d3Action = new Promise(function(resolve, reject){
      var latArray = [],
          longArray = [],
          getLatLong = d3.json("./SRC/ratp_2013.json", function (error, data){
    
            for(i in data.stops) {
              longArray.push(data.stops[i].longitude);
              latArray.push(data.stops[i].latitude);
            }
            resolve(longArray, latArray);
    
          });
    });
    
    d3Action.then(function(longArray, latArray){
      console.log(longArray, latArray)
    })
    

答案 3 :(得分:0)

这与执行时间有关。

JSON调用是异步的。这意味着浏览器不会等待它。

您的执行路径如下所示:

  • 定义数组
  • 致电JSON
  • console.log arrays
  • 收到JSON
  • 将信息放入数组

试试这个:

var latArray = new Array();
var longArray = new Array();
var getLatLong = d3.json("./SRC/ratp_2013.json", function (error, data){



        for(i in data.stops)
        {
            longArray.push(data.stops[i].longitude);
            latArray.push(data.stops[i].latitude);
        }

        logArrays();
});
function logArrays() {
   console.log(longArray); //Prints an empty array.
   console.log(latArray);  //Prints an empty array.
}

执行路径是:

  • 定义数组
  • 致电JSON
  • 收到JSON
  • 将信息放入数组
  • 呼叫记录功能
  • console.log arrays

答案 4 :(得分:0)

因为:

console.log(longArray); //Prints an empty array.
console.log(latArray);  //Prints an empty array.

在此之前运行:

var getLatLong = d3.json("./SRC/ratp_2013.json", function (error, data){
    for(i in data.stops)
    {
        longArray.push(data.stops[i].longitude);
        latArray.push(data.stops[i].latitude);
    }

    console.log(longArray); //Prints the Array of latitudes
    console.log(latArray);  //Prints the Array of longitudes
});

传递给d3.json的函数是异步执行的。

如果你像这样重写它,它应该有效:

function logResult() {
  console.log(longArray);
  console.log(latArray);
}

var getLatLong = d3.json("./SRC/ratp_2013.json", function (error, data){

    for(i in data.stops)
    {
        longArray.push(data.stops[i].longitude);
        latArray.push(data.stops[i].latitude);
    }
    logResult()
});