2013-10-08 51 views
0

我打電話從我的index.html文件的功能。該函數是在我已經在html中提到的JavaScript文件中定義的。但是返回值總是未定義的。當我調試我可以看到返回字符串中的值。d3.js返回的函數值總是不確定

Follwing是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> 

代碼中,我得到的URL提供以及diDataUrlPrefix的參數值。

以下是在JavaScript文件中的代碼:

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; 

} 

然而SBU的值總是undefined.However我可以看到在parsedCSVapp值。 CSV文件看起來是這樣的:

APPLICATION_ID,應用程序名稱,狀態,名稱,業務部 200039,處理,RED,馬克開始,金融&風險 200070,NGTX,RED,馬克開始,金融&風險 200097 ,WORLD-CHECK,紅,格雷厄姆費舍爾,金融&風險 200009,BOARDLINK,紅,珍妮弗·西蒙,金融&風險 200088,THOMSON ONE,RED,喬納森·溫伯格,金融&風險 200037,數據流,RED,伊恩·布羅克赫斯特,金融&風險 200044,EIKON,RED,奧利維爾·馬丁,金融&風險 200011,協作,RED,弗蘭克Tarsillo,金融&風險

+1

'd3.text'是異步回調。您指定爲參數的函數在調用返回時執行,而其後的代碼立即執行,即當'returnstring'尚未定義時。 –

+0

好的...所以我可以用d3.csv替換d3.text。它會解決這個問題嗎?在這種情況下如何解決這個問題 –

+0

你不能 - 所有這些都是異步的。你需要在回調函數中運行所有你想運行的代碼和返回值。 –

回答

1

d3.text(和d3.csvd3.json和類似)進行異步調用。也就是說,當您運行代碼時,會進行調用並繼續執行,而無需等待該呼叫返回。 的第二個參數的功能是被執行的功能,當調用返回 - 回調。

此功能將不會在同一時間運行d3.text,但後來被執行。你無法確定它將在什麼時候運行。由於其中一個調用而需要調用的任何代碼都需要作爲回調函數的一部分運行,或者從那裏調用。