ZBLOG

JS中睡眠等待的函数

在 JavaScript 中实现“睡眠等待”(延迟执行)通常有以下几种方法,具体选择取决于你的使用场景(如浏览器环境、Node.js 或异步代码流):


1. setTimeout + 回调函数

最基础的延迟执行方法,但会导致回调地狱(Callback Hell):

  1. function sleep(ms, callback) {
  2. setTimeout(callback, ms);
  3. }
  4. // 使用
  5. sleep(2000, () => {
  6. console.log("2秒后执行");
  7. });

2. Promise + setTimeout (推荐)

用 Promise 封装,支持 async/await 语法:

  1. function sleep(ms) {
  2. return new Promise(resolve => setTimeout(resolve, ms));
  3. }
  4. // 用法1:then链式调用
  5. sleep(2000).then(() => {
  6. console.log("2秒后执行");
  7. });
  8. // 用法2:async/await(需在async函数内)
  9. async function demo() {
  10. await sleep(2000);
  11. console.log("2秒后执行");
  12. }
  13. demo();

3. ES2022 Atomics.waitAsync (高级场景)

适用于需要精确控制的场景(如 Worker 线程同步):

  1. // 仅在支持 SharedArrayBuffer 的环境中使用
  2. function highPrecisionSleep(ms) {
  3. const sharedBuf = new SharedArrayBuffer(4);
  4. const sharedArr = new Int32Array(sharedBuf);
  5. return Atomics.waitAsync(sharedArr, 0, 0, ms).value;
  6. }
  7. // 使用
  8. highPrecisionSleep(2000).then(() => {
  9. console.log("高精度等待2秒");
  10. });

注意:此 API 对运行环境有严格要求(如 HTTP 响应头需配置 COOP/COEP)。


4. Node.js 特有方法

(1) setImmediate / process.nextTick

微任务队列控制(非真正“睡眠”):

  1. // nextTick优先于其他I/O事件
  2. process.nextTick(() => {
  3. console.log("下一个事件循环执行");
  4. });

(2) timers/promises (Node.js v15+)

原生 Promise-based API:

  1. import { setTimeout } from 'timers/promises';
  2. await setTimeout(2000); // 直接使用

5. Busy Waiting (不推荐)

阻塞主线程的暴力方法(仅用于特殊调试):

  1. function busyWait(ms) {
  2. const start = Date.now();
  3. while (Date.now() - start < ms) {}
  4. }
  5. busyWait(2000); // ❌页面会卡死!

警告:这种方法会冻结 UI/主线程,永远不要在生产环境使用!


最佳实践建议

场景 方案 备注
通用延迟 Promise + setTimeout 兼容性好
Node.js timers/promises 代码最简洁
高精度需求 Atomics.waitAsync 环境要求严格
避免阻塞 永远不用busy wait -

如果需要在 循环中依次延迟,可以结合 for + await: “`javascript async function delayedLoop() {

  1. for (let i = 0; i < 5; i++) {
  2. await sleep(1000);
  3. console.log(`第${i+1}次输出`);
  4. }

} delayedLoop(); “`


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23234

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?