当前位置: 首页 > news >正文

第九节 高频代码题-实现Sleep函数(异步控制)

⚙️ 一、基础实现方案

1. ​​Promise + setTimeout 标准实现​
function sleep(ms: number): Promise<void> {return new Promise(resolve => setTimeout(resolve, ms));
}

​原理​​:

  • 返回一个 Promise 对象,在指定毫秒(ms)后调用 resolve 结束等待。
  • 通过 setTimeout 实现异步调度,避免阻塞主线程。
2. ​​使用示例(async/await)​
async function demo() {console.log("开始等待");await sleep(2000); // 暂停 2 秒console.log("等待结束");
}
demo();

​输出​​:

开始等待
(2秒后)
等待结束

🚀 二、工程化增强方案

1. ​​支持返回值传递​

通过泛型扩展 sleep 功能,实现延迟后返回数据:

function sleep<T>(ms: number, value?: T): Promise<T | void> {return new Promise(resolve => setTimeout(() => resolve(value), ms));
}// 使用:延迟后返回字符串
async function fetchWithDelay() {const data = await sleep(1000, "Hello, World!");console.log(data); // 输出 "Hello, World!"
}
2. ​​集成错误处理​

支持延迟中抛出异常:

function sleep(ms: number, shouldReject = false): Promise<void> {return new Promise((resolve, reject) => {setTimeout(() => {shouldReject ? reject(new Error("Sleep interrupted")) : resolve();}, ms);});
}// 使用:模拟失败场景
async function riskyOperation() {try {await sleep(1000, true);} catch (error) {console.error(error.message); // 输出 "Sleep interrupted"}
}

⚠️ 三、关键注意事项

  1. ​非阻塞特性​
    sleep 通过事件循环实现延迟,​​不会阻塞同步代码​​:

    console.log("Start");
    sleep(2000).then(() => console.log("Delayed"));
    console.log("End");
    // 输出:Start → End →(2秒后)→ Delayed
  2. ​禁止同步滥用​
    在同步函数中调用 await sleep() 会导致整个函数暂停,但若在非 async 函数中使用会报错:

    function syncFunction() {await sleep(1000); // ❌ 语法错误:await 仅在 async 函数中有效
    }
  3. ​替代方案对比​

    ​方法​​适用场景​​缺点​
    setTimeout简单回调场景嵌套易导致回调地狱
    Promise + sleep现代异步流程(推荐)需配合 async/await
    第三方库(如 bluebird复杂任务调度增加依赖体积

💡 四、典型应用场景

  1. ​接口轮询控制​

    async function pollAPI() {while (true) {const data = await fetchData();if (data.status === "ready") break;await sleep(5000); // 每 5 秒轮询一次}
    }
  2. ​用户操作防抖​

    let searchTimer: number;
    function onSearchInput(query: string) {clearTimeout(searchTimer);searchTimer = setTimeout(async () => {await sleep(300); // 延迟 300ms 后执行搜索runSearch(query);}, 300);
    }
  3. ​动画序列控制​

    async function playAnimations() {animateElement1();await sleep(1000);animateElement2();await sleep(500);animateElement3();
    }

🛠️ 五、扩展:Node.js 环境优化

在 Node.js 中可复用 setTimeout,或使用 setImmediate 实现微秒级延迟:

import { setTimeout } from "timers/promises"; // Node.js 16+async function nodeSleep(ms: number) {await setTimeout(ms);
}

​最佳实践总结​​:

  • ✅ ​​优先 Promise 方案​​:保持代码简洁与现代异步规范兼容;
  • ⚠️ ​​避免同步思维​​:理解事件循环机制,禁止在非 async 函数中调用 await sleep()
  • 🚀 ​​场景驱动设计​​:根据轮询、动画、防抖等需求选择合理延迟时长。

文章转载自:

http://X8WjpgiR.zqcdL.cn
http://jqqBdD5z.zqcdL.cn
http://ITQIw4yu.zqcdL.cn
http://9PSsCiqT.zqcdL.cn
http://VUWi1mZo.zqcdL.cn
http://6TLCrOEj.zqcdL.cn
http://6pGDaOZW.zqcdL.cn
http://EO9kM5qH.zqcdL.cn
http://F1mVWZ0r.zqcdL.cn
http://oeLK3PLA.zqcdL.cn
http://Z0Bbf7Oo.zqcdL.cn
http://gYPC7EG0.zqcdL.cn
http://9fng6yAr.zqcdL.cn
http://QeG5PwtV.zqcdL.cn
http://3RXO9MVs.zqcdL.cn
http://VAGHGcJN.zqcdL.cn
http://dmsRbCWD.zqcdL.cn
http://35hkv5Ea.zqcdL.cn
http://cZ7ovAZT.zqcdL.cn
http://Of2Gkfmh.zqcdL.cn
http://sRNkTZf2.zqcdL.cn
http://58b4rjo7.zqcdL.cn
http://ZZ9nOnKz.zqcdL.cn
http://wdVlOt0I.zqcdL.cn
http://d8ThX2bS.zqcdL.cn
http://z5qYwIup.zqcdL.cn
http://8N3ljCy3.zqcdL.cn
http://14DXVnlV.zqcdL.cn
http://G5tuYxTx.zqcdL.cn
http://poG5NJnV.zqcdL.cn
http://www.dtcms.com/a/246700.html

相关文章:

  • 在线机考|2025年华为暑期实习春招秋招编程题(最新)——第1题_物流运输
  • 达梦数据库适配的 Druid 连接池深度优化指南
  • 2025虚幻游戏逆向工程解包尝试
  • Java Solon v3.3.2 发布(可替换,美国博通公司的 Spring 方案)
  • 博客园突发大规模DDoS攻击 - 深度解析云安全防御新范式
  • 《深入理解Apache Dubbo 与实战》笔记
  • 经典 C 程序 100 例实战详解:从入门到精通的一周学习计划
  • 【idea】工具使用报错记录
  • 0612_正则表达式
  • PostgreSQL 用户名大小写处理规则
  • 【力扣 简单 C】206. 反转链表
  • Java八股文——MySQL「SQL 基础篇」
  • STM32通用定时器TRC含义解析
  • Docker Docker Compose 一键安装
  • 国产USRP X410 PRO/PRO+:开启软件无线电的全频段多通道新时代
  • 白杨SEO:抖音DOU+、巨量广告、巨量千川、巨量本地推投流有什么区别与技巧?
  • 设计模式——责任链
  • Nuttx之mm_realloc
  • MPMA:Preference Manipulation Attack Against Model Context Protocol
  • Java学习笔记之:Vue中路由的基本使用
  • OpenCV 多边形绘制与填充
  • 【鸿蒙开发】组件动态创建
  • CKA考试知识点分享(11)---CRD
  • 在 Vue 3 中修改 el-select 组件接收的 prop 值
  • reactor模型
  • vue下的xlsx文件导出和导入的写法
  • java(JDBC)
  • [Blender] 高质量材质推荐第四弹:25-30号精选纹理资源详解
  • [MSPM0开发]MSPM0G3507之GPIO输入、输出、中断使用(基于driverlib库)
  • 销售预测的方法与模型(二)丨商品与库存分类——基于数据模型运营的本质和底层逻辑销售