web-dev-qa-db-ja.com

Javascript wait()関数

Javascriptの「待機」関数を作成します。何を編集する必要がありますか?

function wait(waitsecs){
setTimeout(donothing(), 'waitsecs');
}

function donothing() {

}

編集(2019)

この質問は明らかにかなり人気がありました。

6.5年、極端な量のJSエクスペリエンスと4つのECMAバージョンが後になって、私は現在、私とおそらくこの質問に出くわしたほとんどの人が達成したかったものに対する最も美しい解決策だと思います:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms))
}

console.log('This is a message')
await sleep(5000)
console.log('This is a message 5 seconds into the future')

これはどこでも使うべきものではありません。しかし、それは私が当時探していたものを正確に実行し、それを豪華に実行します。トリックがあり、もちろんsetTimeoutがありましたが、この質問をしたとき、私が望んでいた方法を達成することは不可能でした。

14
eds1999

Javascriptはスレッド化されていないため、「待機」によりページ全体がフリーズします(おそらく、ブラウザーでスクリプトの実行が完全に停止する可能性があります)。

問題に具体的に対処するには、donothing呼び出しでsetTimeoutの後の括弧を削除し、waitsecsを文字列ではなく数字にする必要があります。

console.log('before');
setTimeout(donothing,500); // run donothing after 0.5 seconds
console.log('after');

しかし、それでも実行は停止しません。関数の実行前に「後」が記録されます。

適切に待機するには、匿名関数を使用できます。

console.log('before');
setTimeout(function(){
    console.log('after');
},500);

すべての変数は、「後」セクションに残ります。これらを連鎖させるべきではありません。必要な場合は、プログラムをどのように構築しているかを調べる必要があります。また、ループする必要がある場合は、setInterval/clearIntervalを使用することもできます。

48
Dave

編集しないでください。完全に廃棄する必要があります。

一定時間実行を停止しようとすると、ブラウザーがロックされ、ブラウザーが応答なし状態に切り替わります。できることは、setTimeoutを正しく使用することだけです。

3