如下面的代码所示,我试图读取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.
答案 0 :(得分:1)
非常确定是异步电话。
您的控制台是否首先打印空数组,然后打印已填充的数组?
如果是异步通话,那么还应该有一个' onDataLoaded'这一事件。
答案 1 :(得分:1)
由于调用的异步性质,这种情况正在发生。执行程序不会等待响应并从下一行开始执行。您可以在链接中找到更多详细信息:D3 API
因此,在这种情况下,您可以使用以下任一选项获得所需的结果:
在回调函数
使用功能链(即获得回复后,您可以拨打电话 到其他一些函数,并在该函数中编写代码。)
答案 2 :(得分:0)
我猜测d3.json
是一个异步函数。
这意味着只要您的d3.json
函数触发,console.log
函数也会触发。他们都被一起解雇了。
因此,在阅读文件时,您会调用console.log
个。
你可以:
Promise
(ES6)... 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调用是异步的。这意味着浏览器不会等待它。
您的执行路径如下所示:
试试这个:
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.
}
执行路径是:
答案 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()
});