2017-10-29 16 views
0

機能:遅延は、私はループのために、この中に小さな遅延を作成する必要が

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

stackoverflowの例に続いて、私は、このソリューションを試してみました:

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

は、しかし、これは内部の機能を破ります。 myElemは常にnullになっているようです。あまりにも多くの "私"ですか?これをどうすれば解決できますか?

+0

'for'ループが最後までほとんどすぐに実行されます。このような遅延の作成は単純な問題ではありません。ここで私の答えを見てください:https://stackoverflow.com/a/37563825/5768908 –

+0

あなたの変数は 'i'宣言されていますか? *(明示的にまたは暗黙的に)*関数が実行されたときに 'i'の値をチェックしましたか? – Thomas

+0

Gerardも動作しません。 "i"はループのためだけに使用されます。遅延コードがなければ、元のコードは正常に動作します(https://pastebin.mozilla.org/9071510)。これはform1、form2などを循環します。サーバーは同時に10個の投稿を処理できないため、遅延が必要です。 –

答えて

0

Nevermind。コードがうまくいかなかった理由は簡単でした。以下のコードの残りの部分は、遅延ループが終了するのを待たずに、関数を実際に破った。

これは(setTimeout関数の内部に配置され)それを修正:

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

ここではグローバル変数 'k'を有効に定義し、setTimeoutの内側でそれをインクリメントしています。このループを2度目に実行すると、最初に中断した値で開始します。 –

+0

それがポイントです。各遅延ループ後にのみ増加します。しかし、その外の数を知っている。 –

1

あなたはそれが各反復に一意であるため閉鎖内の変数を定義する必要があります。

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

...または閉包の定義にiを含めます。

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

関連する問題