在此代码中, 主要国家console.log()总是变为空
但是" csv"中的国家/地区console.log()总是变得很好。我在这里失踪的是什么?在控制台中,为什么我看到console.log("主要国家:",cn)首先打印而不是console.log(" csv和#34中的国家/地区)?
//in csv.js file :
var rpc_csv = function()
{
var countries = null;
d3.csv("data/rpc_stas.csv", function(rpc_data)
{
//rpc_data is an array of json objects containing the data in from the csv
//console.log("rpc_data:", rpc_data)
countries = rpc_data.columns;
console.log("countries in csv ", countries)
return countries;
});
return countries;
}
// in script.js file :
var cn = rpc_csv()
console.log("main contries:",cn);

<script src="https://d3js.org/d3.v4.min.js"></script>
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="js/d3.v4.js"></script>
<script type="text/javascript" src="js/underscore-min.js"> </script>
<script type="text/javascript" src="js/csv.js"></script>
</head>
<body>
<div id="ratiopercountry"></div>
<script src="js/script.js"></script>
</body>
</html>
&#13;
答案 0 :(得分:1)
这是因为您的函数以异步方式运行并在从csv实际获取国家/地区数据之前返回空值。
因此,您可以使用回调来实现您的需求。
var rpc_csv = function(_callback)
{
try{
var countries = null;
d3.csv("data/rpc_stas.csv", function(rpc_data)
{
//rpc_data is an array of json objects containing the data in from the csv
//console.log("rpc_data:", rpc_data)
countries = rpc_data.columns;
console.log("countries in csv ", countries)
return _callback(countries);
});
//return countries;
}
catch(ex){
console.log(ex);
return null;
}
// in script.js file :
var cn = null;
rpc_csv(function(countries){
cn = countries;
console.log("main contries:",cn);
})
希望这有帮助!
答案 1 :(得分:0)
d3.csv是asynchronous function
,意味着rpc_data将在函数rpc_csv
返回的不同时间点返回。
所以基本上,你总是会在函数中返回null
,因为它会像下面那样运行。
//in csv.js file :
var rpc_csv = function()
{
var countries = null;
// d3.csv is an asynchronous function. The callback supplied
// will be executed once the csv file is read.
return countries;
}
理想情况下,您希望在提供给d3.csv
函数的回调中进行数据处理。
答案 2 :(得分:0)
好了,了解发生了什么。
在你的情况下
console.log("main contries:",cn);
// execute before
console.log("countries in csv ", countries)
解释将解释这是如何发生的。
d3.csv
的第一个是调用它时的I / O绑定请求。它以异步方式执行,因为它将是http,文件读取,数据库都是异步执行的。
让我们举一个你的代码的例子。并将d3.csv(
更改为settimeout
。
运行此代码也可以作为您的代码,因为settimeout is i/o bound
。
var rpc_csv = function()
{
var countries = null;
setTimeout(function(){
countries ="US";
console.log("countries in csv ", countries)
}, 3000);
return countries;
}
// in script.js file :
var cn = rpc_csv()
console.log("main contries:",cn);
希望这对你有所帮助。