await
することができるsetTimeout
を1行で書くイディオムです。
await new Promise(resolve => setTimeout(resolve, 3000)) // 3秒待つ
// ... 3秒後の処理 ...
Node.jsならもっと短く書ける
Node.jsではawait
に対応したsetTimeout
がモジュールとして提供されているので、さらにシンプルに書けます。
import { setTimeout } from "node:timers/promises";
await setTimeout(3000); // 3秒待つ
- Node.js互換のBunやDenoでもこの書き方が使えます。
- ブラウザでは動作しないので注意です。
Bunならもっと宣言的
Bunならimport
なしにBun.sleep
関数を呼び出すだけです。また、関数名もsleep
となり、より宣言的です。
await Bun.sleep(3000); // 3秒待つ
Bun専用になっちゃいますので、そこは注意点です。
おまけ: よくある長めの実装からの変形手順
// よくある長めの実装
const sleep = () => new Promise(resolve => {
setTimeout(() => {
resolve()
}, 3000)
})
await sleep()
// ステップ1: () => { resolve() } は resolve に短縮する
const sleep = () => new Promise(resolve => {
setTimeout(resolve, 3000)
})
await sleep()
// ステップ2: resolve => {} は resolve => に短縮する
const sleep = () => new Promise(resolve => setTimeout(resolve, 3000))
const promise = sleep()
await promise
// ステップ3: sleep()は関数でなくていいので値にする
const promise = new Promise(resolve => setTimeout(resolve, 3000))
await promise
// ステップ4: 完成
await new Promise(resolve => setTimeout(resolve, 3000))