JavaScriptはシングルスレッドでイベント駆動型なので、whileループが実行されている限り、setInterval()
は決して起動できず、そのコールバックは決して呼び出されません。だからあなたはwhileループがちょうど永遠に走るデッドロックがあります。 JavaScriptをイベントドリブン自然と
、setInterval()
はイベントキューにイベントを置きますが、あなたのwhile
ループの実行が停止することはありませんので、インタプリタは、それが実際にJSの現在の実行スレッドを終えることができるポイントに到達したことがないとイベント・キューから次のイベントを取り出して、タイマー・コールバックを実行します。
while
ループを使用して、他のイベントが発生するのを待つことはできません。 Javascriptでは、while
ループ自体が実行されるまで、もう1つのイベントは発生しません。代わりに、タイマーだけを使用し、while
ループは使用しないでください。あなたが解決しようとしている真の問題をもう少し明確に説明できれば、コーディングの解決法を提案することができます。
ここに間違っているものを追加するには、whileループを使用するたびに新しいsetInterval()
タイマーを作成しています(つまり、数多くのタイマーがアクティブになるので積み重ねられます)。
あなたは達成しようとしていることを正確には言いませんが、while
ループではなく、インターバルタイマーだけを使用できるようです。だから、いくつかの操作を150回実行するためにあなたの希望を想定し、500msの間隔を空け、あなたがこれを使用することもできます。これは効用関数に行くことができる、
var count = 0;
var commentLoop = 150;
var timer = setInterval(function() {
// regular code here
// check if we're done repeating
if (count === commentLoop - 1) {
// stop the timer
clearInterval(timer);
} else {
count++;
}
}, 500);
するか、(あなたはそれを動作確認するには、このスニペットを実行することができます):
を
function repeat(numTimes, delay, fn) {
var cntr = 0;
var timer = setInterval(function() {
if (cntr >= numTimes) {
clearInterval(timer);
} else {
// if callback returns true, then stop the timer
if (fn(cntr) === true) {
clearInterval(timer);
}
++cntr;
}
}, delay);
}
// sample usage
repeat(5, 400, function(cnt) {
console.log(cnt);
});
あなたはループを中断することはできません。非同期コードは先制型ではないため、ループが終了するまでループが終了するまで待つ必要があります。 –
[XY問題とは何ですか](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)を参照してください。 –