2017-10-29 2 views
0

Ich brauche eine kleine Verzögerung in dieser for-Schleife zu erstellen:Verzögerung bei der für Schleife Pausen funktionieren

for (i = 1; i <= cloneIndex; i++) { 
         var myElem = document.getElementById('form' + i); 
         if (myElem != null) { 
          function postData() { 
           return { 
           udd: document.getElementById('udd').value, 
           data: date_in, 
           hora_ini: hour_in, 
           hora_fim: hour_out, 
           cat: $('#form' + i).find('select[id="cat"]').val(), 
           m1: $('#form' + i).find('select[id="q1"]').val(), 
           m2: $('#form' + i).find('select[id="q2"]').val(), 
           m3: $('#form' + i).find('select[id="q3"]').val(), 
           m4: $('#form' + i).find('select[id="q4"]').val(), 
           m5: $('#form' + i).find('select[id="q5"]').val() 
           } 
          } 

          var newItem = postData(); 
          $2sxc(@Dnn.Module.ModuleID).webApi.post('app/auto/content/audits', {}, newItem); 
         } 
      } 

Nach Stackoverflow Beispiele habe ich versucht, diese Lösung:

for (i = 1; i <= cloneIndex; i++) { 
       (function(i){ 
        setTimeout(function(){ 
         var myElem = document.getElementById('form' + i); 
         if (myElem != null) { 
          function postData() { 
           return { 
           udd: document.getElementById('udd').value, 
           data: date_in, 
           hora_ini: hour_in, 
           hora_fim: hour_out, 
           cat: $('#form' + i).find('select[id="cat"]').val(), 
           m1: $('#form' + i).find('select[id="q1"]').val(), 
           m2: $('#form' + i).find('select[id="q2"]').val(), 
           m3: $('#form' + i).find('select[id="q3"]').val(), 
           m4: $('#form' + i).find('select[id="q4"]').val(), 
           m5: $('#form' + i).find('select[id="q5"]').val() 
           } 
          } 

          var newItem = postData(); 
          $2sxc(Dnn.Module.ModuleID).webApi.post('app/auto/content/audits', {}, newItem); 
         } 
        }, 1000 * i); 
       }(i)); 
      } 

dies jedoch bricht die Funktion im Inneren . Es scheint, dass myElem jetzt immer null ist. Zu viele "i" s? Wie kann ich das beheben?

+0

A 'for' Schleife wird fast sofort bis zum Ende laufen. Solche Verzögerungen zu schaffen ist keine einfache Sache. Sehen Sie sich meine Antwort hier an: https://stackoverflow.com/a/37563825/5768908 –

+0

In welchem ​​Umfang wird Ihre Variable 'i' deklariert? * (explizit oder implizit) * Und hast du den Wert von "i" überprüft, wenn die Funktion ausgeführt wird? – Thomas

+0

Funktioniert auch nicht Gerard. "i" wird nur für die Schleife verwendet. Ohne den Verzögerungscode funktioniert der ursprüngliche Code einwandfrei (https://pastebin.mozilla.org/9071510), er durchläuft form1, form2 usw. Ich brauche nur die Verzögerung, da der Server nicht 10 Posts gleichzeitig verarbeiten kann. –

Antwort

0

Vergesst nicht. Der Grund, warum der Code nicht funktionierte, war einfach. Der Rest des folgenden Codes hat nicht auf das Ende der verzögerten Schleife gewartet, so dass die Funktion tatsächlich unterbrochen wurde.

Diese es fest (im SetTimeout Funktion gesetzt):

k++; 
if (k == cloneIndex) {rest of the code that needs the loop to end} 
+0

Vorsicht, Sie definieren hier effektiv eine globale Variable "k" und erhöhen sie innerhalb von setTimeout - wenn Sie diese Schleife ein zweites Mal ausführen würden, würde sie mit dem Wert beginnen, der beim ersten Mal aufgehört hat. –

+0

Das ist der Punkt. Es erhöht sich nur nach jeder verzögerten Schleife. Aber weiß die Zählung außerhalb. –

1

Sie müssen die Variable innerhalb des Verschlusses zu definieren, dafür zu jeder Iteration eindeutig sein:

for (var i = 1; i < 10; i++) { 
 
    (function() { 
 
    var k = i; // <-- k will be different for each iteration, because it was declared inside the closure. i was defined outside the closure. 
 
    setTimeout(function() { 
 
     console.log("Delayed: ", i, k) 
 
    }, i * 1000) 
 
    }()); 
 
}

... oder auch i in den Verschluss Definition:

for (var i = 1; i < 10; i++) { 
 
    (function(i) { 
 
    setTimeout(function() { 
 
     console.log("Delayed: ", i) 
 
    }, i * 1000) 
 
    }(i)); 
 
}

Verwandte Themen