2016-11-23 13 views
2

タイムアウトとループが一緒に機能するように見えません。ループを削除した場合は動作しますが、タイムアウトを削除しても動作します。一緒に私は無限のループを取得し、タイムアウト関数のように思えるdoesntの中には、そのループの内側に実行されます。

助けていただけたら幸いです!

function doTask (list) { 
    if (list) { 
     while (list.length > 0) { 
      (function(list){ 
       $timeout(function() { 
        list.splice(0, 1); 
        console.log("timeout...") 
       }, 5000); 
      })(list); 
     } 
    } 
} 
+1

これは、5秒後に呼び出されるsetTimeoutで長さが変更されているためですが、コードがループから抜けることはありません。 – Rajesh

+0

実際に何をしたいですか? – Sandeeproop

+0

リストが空になるまでループしたいが、ループを遅らせる。 –

答えて

4

ループするにはrecursionを使用する必要があります。また、には[]が本当の値であることを確認する必要があります。

function doTask(list) { 
 
    if (list.length) { 
 
    setTimeout(function() { 
 
     list.splice(0, 1); 
 
     console.log("timeout...") 
 
     doTask(list); 
 
    }, 500); 
 
    } 
 
} 
 
var list = [1,2,3,4,5] 
 
doTask(list);

+0

パーフェクト!ありがとうございました! –

2

あなたのコードは、タイムアウト機能を実行する機会を与えることはありません。

doTaskが呼び出されると、実行のためにスタックに移動します。各ループ反復では、このdoTaskが終了したときに実行されるタイムアウトを登録しています。しかし、タイムアウトのチャンスを決して与えなかったので、リストの長さは決して減少しませんでした。なぜそれが永久に動いているのかです。

これはあなたのクエリを明確にします。

関連する問題