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

【面试题】写一个睡眠函数

题目要求

请你编写一个异步函数,它接收一个正整数参数 millis ,并休眠 millis 毫秒。要求此函数可以解析任何值。

示例 1:

输入:millis = 100
输出:100
解释:
在 100ms 后此异步函数执行完时返回一个 Promise 对象
let t = Date.now();
sleep(100).then(() => {
console.log(Date.now() - t); // 100
});

示例 2:

输入:millis = 200
输出:200
解释:在 200ms 后函数执行完时返回一个 Promise 对象

方法 1:使用 Promises 和 setTimeout 的异步编程

概述

在 JavaScript 中,通常使用承诺来处理异步操作。承诺表示一个值,该值可能还不可用,但将在将来的某个时候解决(或在出错的情况下拒绝)。要在 JavaScript 中模拟延迟或“休眠”,我们可以使用 setTimeout 函数,该函数将一个函数调度为在一段时间后运行。

该任务要求我们创建一个休眠指定毫秒的异步函数。要实现这一点,我们可以将 promises 与 setTimeout 结合起来。我们将返回在指定延迟后解决的承诺。

算法步骤

  1. 定义一个名为 sleep(millis) 的异步函数。此函数在解析之前将暂停执行 millis 毫秒。
  2. 在该函数内部,构造一个新的 promise 对象。这个 promise 对象的 executor 函数是我们将合并延迟的地方。
  3. 在 executor 函数中,使用 setTimeout 方法。setTimeout 是由主机环境(Web 浏览器、Node.js等)提供的方法。它在指定的延迟后执行提供的函数或代码段。
  4. 将 setTimeout 的延迟设置为 millis 毫秒。延迟后执行的代码将是 promise 的 resolve 方法。
  5. 当调用 resolve 方法时,它会将承诺标记为已实现,从而允许执行任何附加的 .then 处理程序。

实现

async function sleep(millis) {return new Promise(resolve => {setTimeout(resolve, millis);});
}

在此实现中,sleep 函数是返回 promise 的异步函数。promise 的 executor 函数使用 setTimeout 在 millis 毫秒后解析 promise。请注意,我们实际上并不需要将睡眠功能设置为异步,因为我们直接返回一个 promise,但将其标记为 async 并不会有什么坏处。

你可以像这样在你的代码中使用 sleep 函数:

let t = Date.now();
sleep(100).then(() => {console.log(Date.now() - t); // 大约 100
});

在这种用法中,我们记录当前时间,调用 sleep 函数,然后记录 promise 解析时经过的时间。运行时间应该大致等于 sleep 的输入,这表明函数确实已经“休眠”了指定的时间量。

请注意,使用 return new Promise() 或 return await new Promise() 都会在异步函数中产生相同的结果,如概述部分所述。

此外,使用 try {} catch(){} 也是异步编程中的一种常见做法,因为它允许您处理可能引发的任何潜在异常。在下面的解决方案中,如果在 setTimeout 函数的执行过程中出现错误,则 promise 被拒绝,并抛出错误:

async function sleep(millis) {return new Promise((res,rej) => {try {setTimeout(() => res(5), millis)} catch(err) {rej(err)}})
}

方法 2:使用 Promises 和 setTimeout 不带返回的异步编程

这种方法与第一种方法类似,但略有不同:对于这个问题,您不需要显式返回任何内容。这也使以下代码成为有效的解决方案。此版本的 sleep 函数不返回任何内容(或者更准确地说,它返回 undefined),因为没有返回语句。但由于问题陈述说,“它可以求解任何值”,这是完全可以接受的。这也是一个非常有效的俏皮话。

实现

async function sleep(milliseconds) {await new Promise(res => setTimeout(res, milliseconds)); 
}

相关文章:

  • leetcode-2.两数相加
  • 【数据倾斜笔记】
  • Pandas中concat的用法
  • JavaScript:正则表达式
  • 【线性代数】决定张成空间的最少向量线性无关吗?
  • uniapp+echarts开发APP版本教程
  • 5.2 显示窗口的内容(二)
  • JUnit 5和Mockito单元测试
  • css 用多个阴影做出光斑投影的效果 box-shadow
  • 学习笔记-MyBatis的工作原理。
  • 求解拍频的信号特征
  • LeetCode1491. Average Salary Excluding the Minimum and Maximum Salary
  • 【2023年12月18日-12月25日】一周AI咨询更新
  • 昇腾910平台安装驱动、固件、CANN toolkit、pytorch
  • Qt基础之四十三:Qt智能指针(QPointer、QSharedPointer、QWeakPointer和QScopedPointer)
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 《Java编程思想》读书笔记-对象导论
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • nodejs调试方法
  • Python_网络编程
  • 官方解决所有 npm 全局安装权限问题
  • 如何选择开源的机器学习框架?
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 少走弯路,给Java 1~5 年程序员的建议
  • 异步
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​iOS实时查看App运行日志
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • (7)STL算法之交换赋值
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二十四)Flask之flask-session组件
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (六)c52学习之旅-独立按键
  • (论文阅读11/100)Fast R-CNN
  • (推荐)叮当——中文语音对话机器人
  • (一)基于IDEA的JAVA基础1
  • (转)ObjectiveC 深浅拷贝学习
  • (转)四层和七层负载均衡的区别
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .Net Redis的秒杀Dome和异步执行
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net连接oracle数据库
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .Net语言中的StringBuilder:入门到精通
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • []我的函数库
  • [ABC294Ex] K-Coloring
  • [android] 切换界面的通用处理