2013-10-08 6 views
0

Я вызываю функцию из моего файла index.html. Функция определена в файле javascript, о котором я упоминал в html. Однако возвращаемое значение всегда не определено. Когда я отлаживаю, я мог видеть значение в возвращаемой строке.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, Имя приложения статус, имя, Business Unit 200039, DEALING, RED, Марк Бегун, финансовый & риск 200070, NGTX, RED, Марк Бегун, финансовый & риск 200097 , МИР-CHECK, RED, Грэм Фишер, финансовый & Риск 200009, BOARDLINK, RED, Дженнифер Саймон, финансовый & Риск 200088, THOMSON ONE, RED, Джонатан Вайнберг, финансовый & Риск 200037, DATASTREAM, RED, Ян Броклехерст, Финансовый & Риск 200044, EIKON, RED, Оливье Мартин, Финансовый & Риск 200011, ВЗАИМОДЕЙСТВИЕ, RED, Франк Tarsillo, Финансовый & Риск

+1

'd3.text' - это асинхронный обратный вызов. Функция, которую вы укажете в качестве аргумента, выполняется, когда вызов возвращается, а код после его выполнения немедленно, то есть когда 'returnstring' еще не определен. –

+0

ok ... так что я могу заменить d3.text на d3.csv. Будет ли это решено? Как это можно разрешить в этом случае –

+0

Вы не можете - все они асинхронны. Вам нужно запустить весь код, который вы хотите запустить, с возвращаемым значением в функции обратного вызова. –

ответ

1

d3.textd3.csv, d3.json и подобное) делать асинхронные вызовы. То есть, когда вы запускаете код, вызов выполняется, и выполнение возобновляется, не дожидаясь возврата вызова. Второй аргумент для этих функций - это функция, которая запускается при возврате вызова - обратном вызове.

Эта функция не будет выполнена одновременно с запуском d3.text, но позже. Вы не можете определить, в какое время он будет запущен. Любой код, который вы хотите вызвать в результате одного из этих вызовов, должен быть запущен как часть функции обратного вызова или вызван оттуда.

Смежные вопросы