d3.js函数的返回值始终未定义

d3.js函数的返回值始终未定义,d3.js,D3.js,我正在从index.html文件调用一个函数。该函数是在我在html中提到的javascript文件中定义的。但是,返回值始终未定义。调试时,我可以看到返回字符串中的值 下面是index.html中的代码 <script type="text/javascript"> function readQueryStringparam(name) { name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]

我正在从index.html文件调用一个函数。该函数是在我在html中提到的javascript文件中定义的。但是,返回值始终未定义。调试时,我可以看到返回字符串中的值

下面是index.html中的代码

<script type="text/javascript">
function readQueryStringparam(name) 
    {

        name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
        var regexS = "[\\?&]" + name + "=([^&#]*)";
        var regex = new RegExp(regexS);
        var results = regex.exec(window.location.href);
        if (results == null)
        return "";
        else
        return results[1];
    } 


function getDiDataUrlPrefix() 
{

             diDataUrlPrefix = diGlobal.instanceInfo.getDiDataUrlPrefix();
            //alert(diDataUrlPrefix);   
            sbu = readQueryStringparam('sbu');
            appid = readQueryStringparam('appid');


            if (sbu.length > 0) 
            {
                sbu = sbu.trim();
                CreateChart(diDataUrlPrefix,sbu,0,appid);
            }
            else if (appid.length > 0)
                {

                    sbu = GetSBUForApplication(appid);
                    CreateChart(diDataUrlPrefix,0,0,appid);
                }
}

 </script>
但是sbu的值总是未定义的。但是我可以在parsedCSVapp中看到这些值。csv文件如下所示:

应用程序Id、应用程序名称、状态、名称、业务单元 200039,交易,红色,金融与风险部 200070,NGTX,RED,Marc,金融与风险部 200097,世界支票,红色,格雷厄姆·费舍尔,金融与风险部 200009,BOARDLINK,RED,Jennifer Simon,金融与风险部 200088,汤姆森一号,瑞德,乔纳森·温伯格,金融与风险部 200037,数据流,红色,伊恩·布罗克赫斯特,金融与风险部 200044,艾肯,瑞德,奥利维尔·马丁,金融与风险部 200011年,COLLABORATION、RED、Frank Tarsillo、Financial&Risk进行异步调用。也就是说,当您运行代码时,会发出调用并继续执行,而无需等待调用返回。 这些函数的第二个参数是在调用返回时执行的函数——回调


此函数将不会在运行d3.text的同时执行,而是在以后执行。您无法确定它将在什么时候运行。作为其中一个调用的结果而要调用的任何代码都需要作为回调函数的一部分运行,或者从那里调用。

d3.text
是一个异步回调。您指定为参数的函数在调用返回时执行,而调用后的代码立即执行,即
returnstring
尚未定义时。确定。。。因此,我可以用d3.csv替换d3.text。它能解决这个问题吗?在这种情况下,如何解决这个问题?你不能--所有这些都是异步的。您需要使用回调函数中的返回值运行所有要运行的代码。当您说回调函数时,是d3.text函数吗?请您详细说明一下
d3.text
(和
d3.csv
d3.json
和类似)是异步调用。这些函数的第二个参数是在调用返回时执行的函数——回调。此函数将不会在运行d3.text的同时执行,而是在以后执行。您无法确定它将在什么时候运行。
function GetSBUForApplication(appid)
{
    setTimeout(function() { }, 10000);
    var string;
    var file = diDataUrlPrefix + "/oss/csvs/Consolidated_RAG.csv";

    d3.text(file, function(datasetText) 
        {

            parsedCSVapp = d3.csv.parseRows(datasetText);


            if (appid >0)
            {
                    parsedCSVapp = parsedCSVapp.filter(function(row)
                    {
                        //alert(parsedCSVapp);
                        return row[0] == appid



                    })//parsed fileter ends here

                returnstring = parsedCSVapp[0][4];



            }

        })



    return returnstring;

}