sleep
JavaScript で次の関数よりも優れた設計方法はありますかpausecomp
(ここから引用)?
function pausecomp(millis)
{
var date = new Date();
var curDate = null;
do { curDate = new Date(); }
while(curDate-date < millis);
}
これは重複ではありませんJavaScript のスリープ - アクション間の遅延;コードの実行前に遅延させるのではなく、関数の途中で実際にスリープさせたいのです。
ベストアンサー1
2017 — 2021 更新
この質問が出された 2009 年以降、JavaScript は大きく進化しました。他のすべての回答は時代遅れか、過度に複雑になっています。現在のベスト プラクティスは次のとおりです。
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
あるいはワンライナーとして:
await new Promise(r => setTimeout(r, 2000));
機能として:
const sleep = ms => new Promise(r => setTimeout(r, ms));
またはTypescriptの場合:
const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));
次のように使用します:
await sleep(<duration>);
デモ:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function demo() {
for (let i = 0; i < 5; i++) {
console.log(`Waiting ${i} seconds...`);
await sleep(i * 1000);
}
console.log('Done');
}
demo();
ご了承ください、
await
async
キーワードで始まる関数内、またはスクリプトの最上位レベルでのみ実行できます。環境の増加。await
現在のasync
関数を一時停止するだけです。つまり、スクリプトの残りの部分の実行をブロックしないということです。ほとんどの場合、これが望ましいことです。ブロッキング構造が必要な場合は、この答え使用してAtomics
.wait
ただし、ほとんどのブラウザではブラウザのメインスレッド上では許可されないことに注意してください。
この「スリープ」関数の作成には、次の 2 つの新しい JavaScript 機能 (2017 年現在) が役立ちました。
- ES2015 のネイティブ機能である Promises(別名ES6)。また、矢印関数スリープ関数の定義において。
- の
async/await
この機能により、コードは Promise が解決 (解決または拒否) されるまで明示的に待機できます。
互換性
- 約束は支持されるNode v0.12以降そしてブラウザで広くサポートされているIEを除く
async
/await
V8に着陸し、Chrome 55以降、デフォルトで有効(2016年12月発売)- 着陸した2016年10月のノード7
- そしてまた着陸した2016年11月のFirefox Nightly
何らかの理由でNode 7より古いバージョン(2017年に寿命を迎える)、または古いブラウザを対象としている場合でも、async
/はawait
引き続き使用できます。バベル(ツールはトランスパイルJavaScript + 新しい機能を単純な古いJavaScriptに統合したtransform-async-to-generator
プラグイン。