web-dev-qa-db-ja.com

JavaScriptのJavaのThread.sleep()に相当するものは何ですか?

JavaScriptのJavaのThread.sleep()と同等のものは何ですか?

158
Niger

簡単な答えは、そのような機能はないということです。

最も近いものは次のとおりです。

var millisecondsToWait = 500;
setTimeout(function() {
    // Whatever you want to do after the wait
}, millisecondsToWait);

あなたは特にビジーウェイトを望まないことに注意してください(例えば、スピンループで)、あなたのブラウザはほぼ確実にJavaScriptを単一で実行しているからです-スレッド環境。

JavaScriptのスレッドを処理するその他のSO質問がいくつかあります。

そして、この質問も役立つかもしれません:

190
Daniel Pryden

このコードで試してください。あなたの役に立つことを願っています。

function sleep(seconds) 
{
  var e = new Date().getTime() + (seconds * 1000);
  while (new Date().getTime() <= e) {}
}
61
David Miró

ECMAScript 2017を使用できると仮定すると、async/awaitおよびsetTimeoutを使用して同様の動作をエミュレートできます。次にスリープ関数の例を示します。

async function sleep(msec) {
    return new Promise(resolve => setTimeout(resolve, msec));
}

その後、次のような他の非同期関数でsleep関数を使用できます。

async function testSleep() {
    console.log("Waiting for 1 second...");
    await sleep(1000);
    console.log("Waiting done."); // Called 1 second after the first console.log
}

コールバックが不要になるため、これは素晴らしいことです。欠点は、非同期関数でのみ使用できることです。舞台裏ではtestSleep関数が一時停止され、スリープが完了すると再開されます。

MDNから:

Await式は、Promiseが履行または拒否されるまで非同期関数の実行を一時停止し、履行後に非同期関数の実行を再開します。

詳細な説明については、以下を参照してください。

18
Richrd

ウェブページを一時停止するので、直接同等のものはありません。ただし、 setTimeout() があります。例:

function doSomething() {
  thing = thing + 1;
  setTimeout(doSomething, 500);
}

閉鎖の例(ダニエルに感謝):

function doSomething(val) {
  thing = thing + 1;
  setTimeout(function() { doSomething(val) }, 500);
}

2番目の引数は起動前のミリ秒です。これをタイムイベントに使用したり、操作を実行する前に待機したりできます。

編集:より明確な結果を得るために、コメントに基づいて更新されました。

7
Nick Craver

スピンループ(関数を遅延させるために何らかの計算を実行するだけで長時間ループするループ)を記述するか、以下を使用できます。

setTimeout("Func1()", 3000);

これは3秒後に「Func1()」を呼び出します。

編集:

クレジットはコメンターに与えられますが、匿名関数をsetTimeoutに渡すことができます。

setTimeout(function() {
   //Do some stuff here
}, 3000);

これははるかに効率的であり、javascriptのeval関数を呼び出しません。

4
Malaxeur

最適なソリューションを得るには、ECMAスクリプト2017にasync/awaitステートメントを使用してください

awaitは非同期関数の内部でのみ使用できます

function sleep(time) {
    return new Promise((resolve) => {
        setTimeout(resolve, time || 1000);
    });
}

await sleep(10000); //this method wait for 10 sec.

注:非同期/待機は、Thread.sleepのような実際に停止したスレッドではなく、シミュレートします

3
Toprak

thread.sleepが行うsetTimeoutは、独自のスレッドで保持および再開しません。 Javascriptには実際に同等のものはありません

2
Eranga

または、指定したミリ秒数後にsetInterval関数を使用して特定の関数を呼び出すこともできます。 setIntervalプロトタイプに対してgoogleを実行するだけで、まったく思い出せません。

0
The Machine