2017-03-15 4 views
4

ここでは、すべての反復に対してタイムアウトを設定しようとしましたが、nodejの性質上できませんでした。それを行う方法はありますか?事前にNode.jsループでタイムアウトを設定できません

おかげ

for (var i = 1; i <= 1000; i++) { 
 
    setTimeout(function() { console.log('something') }, 3000); 
 
}

+0

参考:あなたはタイマーをキャンセルする準備ができたら、あなたがする必要がありますhttp://stackoverflow.com/a/30575612/4315380 – tanmay

答えて

5

それは同時に動作しますが、それをスケジュールすべてのタイムアウト。

あなたは3秒間隔でそれらをスケジュールしたい場合は、使用します。

for (var i = 1; i <= 1000; i++) { 
    setTimeout(function() { console.log('something') }, i * 3000); 
} 

あなたはタイムアウトコールバックの内側にiを使用したい場合は、代わりにこのようなvarletを使用します。

for (let i = 1; i <= 1000; i++) { 
    setTimeout(function() { console.log('something', i) }, i * 3000); 
} 

varでわかるように、すべての行について1001が印刷されます。

for (var i = 1; i <= 1000; i++) { 
    setTimeout(function() { console.log('something', i) }, i * 3000); 
} 

ところで、あなたは矢印関数の構文でそれを簡略化することができます。

for (let i = 1; i <= 1000; i++) { 
    setTimeout(() => console.log('something', i), i * 3000); 
} 

それはこのような何かをすることです行う別の方法 - 代わりに、同時にすべての1000のタイムアウトをスケジュールの作成間隔:

(() => { 
    let i = 0; 
    setInterval(() => { 
     i++; 
     console.log('something', i); 
    }, 3000); 
})(); 

外側のクロージャは、外側のスコープに表示されてからi変数を維持することです。最後の例では、タイムアウトコールバックのスケジュール自体、それが終了するたびとして呼び出される関数を

(() => { 
    let i = 0; 
    let f =() => { 
     i++; 
     console.log('something', i); 
     setTimeout(f, 3000); 
    }; 
    setTimeout(f, 3000); 
})(); 

:またはあなたがこのようなものを使用することができます。

これにはさまざまな方法があり、すべてに賛否両論があります。

たとえば、コールバックが呼び出し間隔より長く実行される可能性がある場合は、setIntervalを使用しないでください。 setTimeoutを使用してすべてのコールバックで自分自身をスケジューリングすると問題はありませんが、一方ではそのような間隔で精度が低くなる可能性があります。あなたはあなたに最適なものをテストする必要があります。

+0

私は、ループは3秒遅れですべてのsetTimeoutを予定してご覧くださいどのような、しかし、すべての反復には100nsのような時間が流れていますが、反復の間にプロセッサの電力についてのこれらの遅延時間を見ることはできません。私は正しい?ループは同期方式を繰り返しますが、完了したら非同期方式に戻りますか? –

2

for (var i = 1; i <= 10; i++) { 
 
    wait('something', i, 10); 
 
} 
 

 
function wait(msg, i, length){ 
 
    setTimeout(function() 
 
    { 
 
    console.log(msg) ; 
 
    }, (i * 3000)); 
 
}

このような何かを試してみてください。 あなたのコードは実際には動作しますが、3秒待ってから約1ms待ちます。

0

実際に探しているのはsetIntervalです。

let runMeEveryThreeSeconds = function() { 
    console.log('hello!') 
} 
let threeSecondTimer = setInterval(runMeEveryThreeSeconds, 3000) 

タイマーは永遠に実行され、3秒ごとに「hello!」という単語が実行されます。あなたのコンソールに印刷されます。

clearInterval(threeSecondTimer) 
+0

ありがとうございましたが、これは解決策ではありません。私は実際にNode.jsループでタイマーの使用法を探していました。このコードスニペットはforループでは機能しません。 –

関連する問題