2016-07-13 2 views
1

У меня есть функция, которая считывает файл CSV и вычисляет расстояние между двумя типами значений «Клиент» и «Помощник»без задержки на петле SetTimeout

function readCSV(e){ 
    var file = e.target.files[0]; 
    var helferList =[]; 
    var kundenList =[]; 
    if (!file) { 
     console.log('file could not be read'); 
      return; 
    } 
    var reader = new FileReader(); 
    reader.onload = function(e) { 
      var contents = e.target.result; 
      var result = $.csv.toArrays(contents); 
     $('.output').append(","); 
     for(i = 0; i< result.length; i++){ 
      if(result[i][0] =="Kunde"){ 
       kundenList.push(result[i]); 
      } 
      else if(result[i][0] =="Helfer"){ 
       helferList.push(result[i]); 
       $('.output').append(result[i][1] + " "+ result[i][2] + ", "); 
      } 
     } 
     $('.output').append("\n"); 
     console.log(kundenList.length); 
     for(i = 0; i< kundenList.length; i++){ 
      $('.output').append(kundenList[i][1] + " "+ kundenList[i][2] + ", "); 
      for(j=0; j <helferList.length;j++){ 
       setTimeout(getDistance(kundenList[i],helferList[j]),500); 

      } 
      $('.output').append("\n"); 
     } 


    }; 
    reader.readAsText(file); 
} 

У меня проблема не в том, что я должен иметь задержку между каждым расчетом расстояния. По этой причине я использую:

setTimeout(getDistance(kundenList[i],helferList[j]),500); 

Но это, кажется, не работает, поскольку нет никакой задержки между расчетами

+0

http://stackoverflow.com/questions/5226285/settimeout-in-for-loop-does-not-print-consecutive -значения –

ответ

1

Вы должны использовать мультипликатор, потому что в вашем текущем коде все функции будут уволены прошло 500 миллисекунды, но не инкрементальные. После 500 миллисекунд исполнения for() все функции будут запущены мгновенно.

Чтобы это изменить, сделать мультипликатор с флагом, как это:

function readCSV(e){ 
    var file = e.target.files[0]; 
    var helferList =[]; 
    var kundenList =[]; 
    if (!file) { 
     console.log('file could not be read'); 
      return; 
    } 
    var reader = new FileReader(); 
    reader.onload = function(e) { 
      var contents = e.target.result; 
      var result = $.csv.toArrays(contents); 
     $('.output').append(","); 
     for(i = 0; i< result.length; i++){ 
      if(result[i][0] =="Kunde"){ 
       kundenList.push(result[i]); 
      } 
      else if(result[i][0] =="Helfer"){ 
       helferList.push(result[i]); 
       $('.output').append(result[i][1] + " "+ result[i][2] + ", "); 
      } 
     } 
     $('.output').append("\n"); 
     console.log(kundenList.length); 
     var k = 0; 
     for(i = 0; i< kundenList.length; i++){ 
      $('.output').append(kundenList[i][1] + " "+ kundenList[i][2] + ", "); 
      for(j=0; j <helferList.length;j++){ 
       // 500 * k = 500 * 1 | 500 * 2 | etc 
       setTimeout(getDistance(kundenList[i],helferList[j]),(500 * k++)); 

      } 
      $('.output').append("\n"); 
     } 


    }; 
    reader.readAsText(file); 
} 
+0

Он работает только при использовании анонимной функции setTimeout (function() {getDistance (kundenList [i], helferList [j])}, (500 * k ++)); Но тогда у меня есть проблема, что параметры неизвестны или null при передаче в getDistance. –

+0

У меня недостаточно информации, чтобы помочь вам с этой ошибкой. Проблема задержки решена с моим ответом. Чтобы решить другую проблему, пожалуйста, создайте с этим новый вопрос. –

+1

Я понял проблему! Мне нужно передать функцию getDistance() как строку. setTimeout ('getDistance ("+ kundenAddress +'", "+ helferAddress + '")', (2000 * k ++)); –