Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法从javascript中的函数返回数据_Javascript - Fatal编程技术网

无法从javascript中的函数返回数据

无法从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

在这部法典中, 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对象数组,包含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