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

时间:2018-01-17 06:01:24

标签: javascript

在此代码中, 主要国家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;
&#13;
&#13;

3 个答案:

答案 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);

希望这对你有所帮助。