web-dev-qa-db-ja.com

JavaScriptのスリープ/遅延/待機機能

この質問がすでにここですでに聞かれている場合、申し訳ありませんが、適切な答えが見つかりませんでした。

JQueryの.delay()のように、スクリプト内のどこでも呼び出すことができるJavaScriptのスリープ/遅延/待機関数を作成したい

Phpによって生成されるスクリプトがあるため、setTimeoutを使用できません。そのため、タイムアウトを中央に置いて2つの異なる関数に配置することはできません。私ができるようにする関数を作成する必要があります

alert("time started");
sleep(4000);
alert("time up");

I 本当に jQueryを使用したくない。

16
user2704237

残念ながらJavascriptを一時停止する関数を入れることはできません。

setTimeout()を使用する必要があります

例:

_function startTimer () {
    timer.start();
    setTimeout(stopTimer,5000);
}

function stopTimer () {
    timer.stop();
}
_

編集:

ユーザーが生成するカウントダウンの場合も、同様に簡単です。

HTML:

_<input type="number" id="delay" min="1" max="5">
_

JS:

_var delayInSeconds = parseInt(delay.value);
var delayInMilliseconds = delayInSeconds*1000;

function startTimer () {
    timer.start();
    setTimeout(stopTimer,delayInMilliseconds);
}

function stopTimer () {
    timer.stop;
}
_

ここで、onchangeなどのstartTimer()のトリガーを追加するだけです。

15
Deep

setTimeoutを使用する必要があるため、問題は次のように表示されます。

PHPで生成されたスクリプトがあるため、2つの異なる関数に入れることはできません。

スクリプトで2つの関数を生成できないのはなぜですか?

function fizz() {
    var a;
    a = 'buzz';
    // sleep x desired
    a = 'complete';
}

次のように書き直すことができます

function foo() {
    var a; // variable raised so shared across functions below
    function bar() { // consider this to be start of fizz
        a = 'buzz';
        setTimeout(baz, x); // start wait
    } // code split here for timeout break
    function baz() { // after wait
        a = 'complete';
    } // end of fizz
    bar(); // start it
}

aの中のbazは、呼び出されたときにbuzzとして始まり、呼び出しの終わりにaの中のfooとして気づくでしょう"complete"になります。

基本的に、すべてを関数でラップし、含まれる関数がそれらを継承するように、すべての変数をそのラッピング関数に移動します。次に、wait NUMBER seconds you echo a setTimeoutに遭遇するたびに、functionを終了し、新しいfunctionを選択して選択します中断したところまで。

10
Paul S.

新しいasync/await構文を使用したソリューションを次に示します。

async function testWait() {
    alert('going to wait for 5 second');
    await wait(5000);
    alert('finally wait is over');
}

function wait(time) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve();
        }, time);
    });
}

注:非同期関数でのみ関数waitを呼び出すことができます

2
Anil Agrawal

現在のブラウザに実装されているJSでは、指定された動作とまったく同じ動作は不可能です。ごめんなさい。

理論的には、ループの終了条件が時間に基づいているループを持つ関数を作成できますが、これによりCPUが占有され、ブラウザが応答しなくなり、デザインが非常に悪くなります。私はこれの例を書くことさえ拒否します;)


更新:私の答えは-1'd(不当)になりましたが、ES6でそれを言及できると思います(これははまだブラウザに実装されておらず、デフォルトでNode.jsで有効化されていません)、非同期コードを同期的に記述することが可能です。そのためには、約束とジェネレーターが必要です。

Q.spawn()を使用して、たとえば調和フラグ付きのNode.jsで、今日使用できます。たとえば、 このブログ投稿 を参照してください(最後の例を参照)。

2
kamituel

これを使用できます-

function sleep(milliseconds) {
    var start = new Date().getTime();
    for (var i = 0; i < 1e7; i++) {
        if ((new Date().getTime() - start) > milliseconds){
            break;
        }
    }
}
2
Tushar

次のコードを使用できます。目的の時間を適切に待機するために、関数を再帰的に呼び出します。

function exportar(page,miliseconds,totalpages)
{
    if (page <= totalpages)
    {
        nextpage = page + 1;
        console.log('fnExcelReport('+ page +'); nextpage = '+ nextpage + '; miliseconds = '+ miliseconds + '; totalpages = '+ totalpages );
        fnExcelReport(page);
        setTimeout(function(){
            exportar(nextpage,miliseconds,totalpages);
        },miliseconds);
    };
}
0
Emi