前言#
在實際開發中,經常遇到需要在異步操作裡進行「延遲」操作的情況,通常會編寫類似於以下的 util
函數來進行處理。
const delay = (ms: number) => new Promise((r) => setTimeout(r, ms));
這很好,很簡潔,也完美地貼合了我們的需求。但是,如果你的代碼跑在純 node
環境下,有一個新的替代方案可以考慮。
使用 node Timers Promises API#
不如試試 node
從 v15.0.0 開始內置支持的 Timers Promises API 提供的 setTimeout
函數,它返回一個 Promise
,與我們剛提到的延遲函數表現基本一致,同時支持更多用法。
import { setTimeout } from 'node:timers/promises'
const sayHi = async () => {
console.log('Hi!')
}
const doSomethingAsync = async () => {
console.log('yolo!')
await setTimeout(1000)
await sayHi()
const res = await setTimeout(1000, 'result');
console.log("res is: ", res)
}
doSomethingAsync()
上述代碼輸出結果如下。
yolo! # 立刻輸出
Hi! # 一秒後輸出
res is: result # 再一秒後輸出
更多詳情請參考 Node.js 官方文檔。