JavaScriptでAsync/Awaitを使ってSleepさせる方法
James Reed
Infrastructure Engineer · Leapcell

Key Takeaways
- JavaScriptには組み込みの
sleep()
はありませんが、setTimeout
とPromisesでシミュレートできます。 async/await
を使用すると、非同期関数での実行を一時停止できます。- このノンブロッキングなsleepメソッドは、メインスレッドの応答性を維持します。
多くのプログラミング言語では、組み込みのsleep()
関数を使用すると、開発者は指定された時間だけコードの実行を一時停止できます。ただし、JavaScriptにはネイティブのsleep()
関数はありません。それにもかかわらず、非同期プログラミング手法を使用して同様の機能を実現できます。この記事では、JavaScriptでsleepのような動作を実装するさまざまな方法について説明します。
JavaScriptの非同期的な性質の理解
JavaScriptは本質的に非同期でシングルスレッドです。setTimeout()
やsetInterval()
のような関数を使用すると、遅延後にコードの実行をスケジュールできますが、それらに続くコードの実行は一時停止しません。例:
console.log('開始'); setTimeout(() => { console.log('遅延'); }, 1000); console.log('終了');
出力:
開始
終了
遅延
上記のように、setTimeout()
関数はconsole.log('遅延')
ステートメントを1秒後に実行するようにスケジュールしますが、コードはこの遅延を待たずにすぐにconsole.log('終了')
を実行します。
Promisesを使用したカスタムSleep関数の作成
sleep関数をシミュレートするには、指定された遅延後に解決されるPromise
を返す関数を作成できます。このアプローチを使用すると、async/await
構文を使用して非同期関数内の実行を一時停止できます。
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
使用例:
async function demoSleep() { console.log('2秒間スリープ...'); await sleep(2000); console.log('起きた!'); } demoSleep();
出力:
2秒間スリープ...
起きた!
この例では、demoSleep
関数はasync
として宣言されているため、await
キーワードを使用して、sleep
関数のPromiseが2秒後に解決されるまで実行を一時停止できます。
ワンライナースリープ関数
簡潔なコードの場合、アロー関数構文を使用してsleep関数をワンライナーとして定義できます。
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
このバージョンは前の例と同一に機能しますが、よりコンパクトな構文を提供します。
ループでのSleepの使用
カスタムsleep関数は、反復間に遅延を導入する場合に、ループ内で特に役立ちます。
async function countWithDelay() { for (let i = 1; i <= 5; i++) { console.log(`カウント:${i}`); await sleep(1000); // 1秒待つ } console.log('カウント完了。'); } countWithDelay();
出力:
カウント:1
カウント:2
カウント:3
カウント:4
カウント:5
カウント完了。
この例では、ループは各反復の間に1秒間待機し、意図したとおりに実行を効果的に一時停止します。
重要な考慮事項
-
非同期関数のみ:
await
キーワードは、async
キーワードで宣言された関数内でのみ使用できます。async
関数の外でawait
を使用しようとすると、構文エラーが発生します。 -
ノンブロッキングな動作: カスタムsleep関数は、メインスレッドをブロックしません。
async
関数内の実行を一時停止しますが、他の操作は同時に実行し続けることができます。 -
ブロッキングループの回避: ビジーウェイトループ(現在の時刻を確認するwhileループなど)を使用して遅延を実装しないでください。メインスレッドをブロックし、アプリケーションが応答しなくなる可能性があります。
結論
JavaScriptにはネイティブのsleep()
関数はありませんが、Promisesとasync/await
構文を使用してこの動作を効果的にシミュレートできます。このアプローチを使用すると、メインスレッドをブロックせずに非同期関数内の実行を一時停止できるため、遅延を処理する際に、より読みやすく保守しやすいコードを作成できます。
FAQs
いいえ、await sleep()
はasync
関数内で使用する必要があります。
いいえ、ノンブロッキングであり、他のタスクを同時に実行できます。
はい:const sleep = ms => new Promise(r => setTimeout(r, ms));
Leapcellは、Node.jsプロジェクトをホストするための最適な選択肢です。
Leapcellは、Webホスティング、非同期タスク、Redisのための次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発します。
無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ支払い — リクエストも料金もかかりません。
圧倒的なコスト効率
- アイドル時の料金なしで、従量課金制。
- 例:25ドルで、平均応答時間60msで694万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察を得るためのリアルタイムのメトリックとロギング。
容易なスケーラビリティと高性能
- 高い同時実行性を容易に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ — 構築に集中するだけです。
詳細については、ドキュメントをご覧ください。
Xでフォローしてください:@LeapcellHQ