无法从javascript中的函数返回数据
在这部法典中, main console.log()总是变为null 但是“csv中的国家”console.log()总是很好。我在这里错过了什么?在控制台中,为什么我看到console.log(“主要国家:”,cn)首先被打印,而不是console.log(“csv中的国家”)无法从javascript中的函数返回数据,javascript,Javascript,在这部法典中, main console.log()总是变为null 但是“csv中的国家”console.log()总是很好。我在这里错过了什么?在控制台中,为什么我看到console.log(“主要国家:”,cn)首先被打印,而不是console.log(“csv中的国家”) //在csv.js文件中: var rpc_csv=函数() { var=null; d3.csv(“数据/rpc_stas.csv”),函数(rpc_数据) { //rpc_data是一个json对象数组,包含cs
//在csv.js文件中:
var rpc_csv=函数()
{
var=null;
d3.csv(“数据/rpc_stas.csv”),函数(rpc_数据)
{
//rpc_data是一个json对象数组,包含csv中的数据
//log(“rpc_数据:”,rpc_数据)
国家=rpc_data.columns;
console.log(“csv中的国家”,国家)
返回国;
});
返回国;
}
//在script.js文件中:
var cn=rpc_csv()
console.log(“主要用户:”,cn)代码>
d3.csv是一个异步函数
,这意味着rpc_数据将在函数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
函数的回调内部进行数据处理。这是因为函数异步运行,并在实际从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);
})
希望这有帮助 好的,让我们了解发生了什么
就你而言
console.log("main contries:",cn);
// execute before
console.log("countries in csv ", countries)
解释将解释这是如何发生的。
调用d3.csv时,d3.csv
中的第一个是I/O绑定请求。它是异步执行的,因为它将是http、文件读取和数据库,所有这些都是异步执行的
让我们以您的代码为例。并将d3.csv(
更改为settimeout
)
运行此代码也将作为您的,因为settimeout是i/o绑定的
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);
希望这对您有所帮助。将国家定义为全局变量不是d3.csv
返回承诺吗?在这两种情况下,代码看起来都是异步的,您需要等待返回值,然后再进行控制台日志记录。它的可能重复项不会返回null
值。它实际上会留下国家
在一段时间内保持不变(使用null
值声明)。如果国家在初始化时声明为1
,则使用OPs代码记录它将记录1
,而不是null