[JS TS] sleepする方法一覧
JSでsleepする方法を複数教えてください。
- マークダウンで回答してください。ただし、方法の名前を#(H1)とします。
- 各方法はsleepする関数を作成し、引数はミリ秒とします。
- コードはJSとTSの両方を作成してください。
セットタイムアウトを使用する方法
// JavaScript function sleepWithSetTimeout(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function main() { console.log('Before sleep'); await sleepWithSetTimeout(2000); console.log('After sleep'); } main(); // TypeScript function sleepWithSetTimeout(ms: number): Promise<void> { return new Promise(resolve => setTimeout(resolve, ms)); } async function main() { console.log('Before sleep'); await sleepWithSetTimeout(2000); console.log('After sleep'); } main();
アクセス可能なウェイトAPIを使用する方法
// JavaScript function sleepWithWait(ms) { const start = new Date().getTime(); let now = new Date().getTime(); while (now - start < ms) { now = new Date().getTime(); } } function main() { console.log('Before sleep'); sleepWithWait(2000); console.log('After sleep'); } main(); // TypeScript function sleepWithWait(ms: number): void { const start = new Date().getTime(); let now = new Date().getTime(); while (now - start < ms) { now = new Date().getTime(); } } function main() { console.log('Before sleep'); sleepWithWait(2000); console.log('After sleep'); } main();
Promiseを使用する方法
// JavaScript function sleepWithPromise(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } function main() { console.log('Before sleep'); sleepWithPromise(2000).then(() => { console.log('After sleep'); }); } main(); // TypeScript function sleepWithPromise(ms: number): Promise<void> { return new Promise(resolve => setTimeout(resolve, ms)); } function main() { console.log('Before sleep'); sleepWithPromise(2000).then(() => { console.log('After sleep'); }); } main();
async/awaitを使用する方法
// JavaScript function sleepWithAsyncAwait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function main() { console.log('Before sleep'); await sleepWithAsyncAwait(2000); console.log('After sleep'); } main(); // TypeScript function sleepWithAsyncAwait(ms: number): Promise<void> { return new Promise(resolve => setTimeout(resolve, ms)); } async function main() { console.log('Before sleep'); await sleepWithAsyncAwait(2000); console.log('After sleep'); } main();
各手法の解説をしてください。
セットタイムアウトを使用する方法
この方法では、setTimeout
関数を使用して指定されたミリ秒数後にコールバック関数が呼び出されるようにします。setTimeout
関数の戻り値はタイマーIDであり、clearTimeout
関数を使用してタイマーをキャンセルすることもできます。Promsieを使用して非同期的に処理する場合は、setTimeout
関数をラップしたPromise
を返す関数を作成し、await
キーワードとasync
関数を使用して非同期的に待つことができます。
アクセス可能なウェイトAPIを使用する方法
この方法では、現在のタイムスタンプと指定されたミリ秒数を比較しながらウェイトを実装します。指定されたミリ秒数の間、whileループ内で現在のタイムスタンプを確認し続けます。指定されたミリ秒数が経過した後、ループが終了し、次の処理が実行されます。この方法は単純ですが、非効率なため、他の方法に比べて推奨されません。
Promiseを使用する方法
この方法では、setTimeout
関数をラップしたPromise
を返す関数を作成します。関数が呼び出された時点で、指定されたミリ秒数後にsetTimeout
関数に渡されたコールバックが実行されます。その後、resolve
関数が呼び出され、Promise
が完了します。この方法では、then
メソッドまたはawait
キーワードを使用して、非同期に処理を待つことができます。
async/awaitを使用する方法
この方法では、setTimeout
関数をラップしたPromise
を返す関数を作成します。setTimeout
関数に渡されたコールバックが実行され、指定されたミリ秒数後にresolve
関数が呼び出されます。その後、await
キーワードを使用して非同期に待ち、指定されたミリ秒数が経過するのを待ちます。非同期関数内でawait
キーワードを使用することで、コードの読みやすさを向上させることができます。
推奨方法
JavaScript
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)) }
TypeScript
function sleep(ms: number): Promise<void> { return new Promise(resolve => setTimeout(resolve, ms)) }
使用例
async function main() { console.log('Before sleep') await sleep(2000) console.log('After sleep') } main();