2016-07-13 6 views
1

I Funktion haben, die eine CSV-Datei liest und den Abstand zwischen zwei Arten von Werten „Client“ berechnet und „Helfer“keine Verzögerung auf SetTimeout Schleife

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); 
} 

Das Problem ich habe, ist, dass ich eine Verzögerung haben müssen zwischen jeder Distanzberechnung. Aus diesem Grund verwende ich:

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

Aber es scheint nicht zu funktionieren, da es keine Verzögerung zwischen den Berechnungen

+0

http://stackoverflow.com/questions/5226285/settimeout-in-for-loop-does-not-print-consecutive -Values ​​ –

Antwort

1

Sie ist muss ein Multiplikator, weil in Ihrem aktuellen Code alle Funktionen übergeben 500 abgefeuert werden verwenden Millisekunden, aber nicht inkrementell. Nach 500 Millisekunden der for() Ausführung werden alle Funktionen sofort ausgelöst.

Um dies zu ändern, Multiplikators mit einer Flagge wie diese machen:

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

Es funktioniert nur, wenn ich eine anonyme Funktion nutze setTimeout (function() {getDistance (kundenList [i], helferList [j])}, (500 * k ++)); Aber dann habe ich das Problem, dass die Parameter unbekannt oder null sind, wenn sie an getDistance übergeben werden. –

+0

Ich habe nicht genug Informationen, um Ihnen bei diesem Fehler zu helfen. Das Problem der Verzögerung ist mit meiner Antwort gelöst. Um das andere Problem zu lösen, erstellen Sie bitte eine neue Frage damit. –

+1

Ich habe das Problem herausgefunden! Ich muss die Funktion getDistance() als String übergeben. setTimeout ('getDistance (' '+ kundenAddress +' ',' '+ helferAddress +' ')', (2000 * k ++)); –