-1

具体的であること:

  • 5 秒後に実行する必要があるコードがあります
  • そのコードは関数内にあります
  • その関数は、すでに setTimeout() 内にある他の関数によって数回呼び出されます

何が起こるかというと、最初は問題なく実行されますが、次の実行では 5 秒も待ちません!

コードは次のようになります。

//==================== create variables: ====================

var x = 0;

//==================== create functions: ====================

function wait5s() {
    setTimeout(function() {
        alert("alert # " + x + "\nNext alert will pop up in 5 seconds now!");
    }, 5000);
    x++;
}

function repeat5times(){
    while (x<5) {
    wait5s()
    }
}


//==================== run this: ====================

alert("Click Ok and Wait 10 seconds for next alert!");
setTimeout(function() {
    repeat5times();
}, 5000);

このコードは私のオリジナルのコードではありませんが、問題は同じです: - アラートがポップアップする前に x が 5 に増加します! すると次々と出現!x++;setTimeout を wait5s() 内に配置しようとしましたが、ブラウザーが応答しなくなりました。:(

各アラートの間に 5 秒の遅延が必要です!

それで、私は何を間違っていますか?:\ 前もって感謝します ;)

4

6 に答える 6

3

setTimeoutwait5s メソッド呼び出しをブロックしない非同期関数です。したがって、タイムアウトを 5 回連続して設定すると、アラート呼び出し関数がタイムアウト キューに入れられ、5 秒後にすぐに呼び出されます。

必要なのは、最初のタイムアウト関数が呼び出された後に次の wait5s を呼び出すことです。

function wait5s(callback) {
    setTimeout(function () {

        alert("alert # " + x + "\nNext alert will pop up in 5 seconds now!");

        x++;
        if(callback){
            callback();
        }

    }, 5000);
}

function repeat5times() {

    var callback = function () {
        if (x < 5) {
            wait5s(callback);
        }
    };

    wait5s(callback);
}
于 2013-11-10T18:04:34.883 に答える
2
  1. setTimeoutx++ を 5 秒ごとにトリガーするには、 の関数内に x を含める必要があります。

  2. あなたは電話していwait5s()ます。x が 5 になる前に継続的に呼び出されます。これを継続的に呼び出すと、5 つの setTimeOut 関数が開始されます。そのため、5 秒後に次々とポップアップします。

    while (x<5) {
       wait5s()
    }
    

それは持っているようなものです:

   setTimeout(function() { alert("go after 5sec");}, 5000);
   setTimeout(function() { alert("go after 5sec");}, 5000);
   setTimeout(function() { alert("go after 5sec");}, 5000);
   setTimeout(function() { alert("go after 5sec");}, 5000);
   setTimeout(function() { alert("go after 5sec");}, 5000);

これらが、期待どおりに機能しなかった理由です。

1 つの解決策は、の関数wait5s();内に if ステートメントを含めることです。setTimeout

于 2013-11-10T18:22:11.807 に答える
1

問題は、このコード:

function repeat5times(){
    while (x<5) {
        wait5s()
    }
}

5 つの setTimeouts をすべて同時に設定するだけです。5 秒ごとに 5 回実行する場合は、別の方法でコーディングする必要があります。setInterval()最初のタイムアウトが発生したときに新しいタイムアウトを使用または設定するかsetTimeout()、それぞれ異なる時間間隔で 5 つのタイムアウトを設定できます。

setTimeout()前の反復が終了したときに次の反復を呼び出す 1 つのメソッドを次に示します。

function repeat5times() {
    var cntr = 0;

    function run() {
        if (cntr < 5) {
            setTimeout(function() {
                ++cntr;
                console.log("alert # " + x + "\nNext alert will pop up in 5 seconds now!");
                run();
            }, 5000);        
        }
    }

    run();
}

を使用した別の方法を次に示しsetIntervalます。

function repeat5times() {
    var cntr = 0;
    var timer = setInterval(function() {
        console.log("alert # " + x + "\nNext alert will pop up in 5 seconds now!");
        ++cntr;
        if (cntr >= 5) {
            clearInterval(timer);
        }
    }, 5000);
}

変数 setTimeouts を使用するメソッドを次に示します。

function waitNs(sec) {
    setTimeout(function() {
        console.log("alert # " + x + "\nNext alert will pop up in 5 seconds now!");
    }, sec * 1000);
}

function repeat5times() {
    for (var i = 1; i <= 5; i++) {
        waitNs(i * 5);
    }
}
于 2013-11-10T18:04:16.683 に答える
0

setIntervalではなく、本当に探しているようですsetTimeout

 function myAlert() {
     alert('Next alert in 5 secs');
 }

 var si = setInterval(myAlert, 5000)

clearIntervalタイマーの停止に使用します。

于 2013-11-10T18:10:43.300 に答える
0

同時に 5 つのアラートを呼び出しています。このコードを試してください

var x = 0;
var t=0;

//==================== create functions: ====================

function wait5s() { 
   t+=5000;
    setTimeout(function() { 
         alert("alert # " + x + "\nNext alert will pop up in 5 seconds now!");
     },t);
   x++;
}

function repeat5times(){ 
while (x<5) { wait5s() } 
}
于 2013-11-10T18:06:45.420 に答える