🎈在 Java 和 Python 中,有专门用于睡眠的函数,分别是 Thread.sleep() 和 time.sleep()。那么JavaScrip能不能也实现一个呢?
请你编写一个异步函数,它接收一个正整数参数 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 对象
提示:
函数内部,它返回一个 Promise 对象。该 Promise 在指定的毫秒数后会被解析(resolve)。
通过调用 setTimeout 函数,我们在指定的毫秒数后调用 resolve 函数,从而解析 Promise。
示例中给出了如何使用 sleep 函数来实现延迟操作。通过调用 sleep(100),我们创建了一个等待 100 毫秒的 Promise。然后,通过调用 .then() 方法,我们设置了当 Promise 解析后的回调函数,它会打印出从等待开始到回调执行时的时间差。
setTimeout 函数存在一定的误差,因为它依赖于浏览器或 Node.js 的事件循环机制。这意味着在某些情况下,setTimeout 可能会比预期的时间稍微早或稍微晚一些执行。
这种误差主要由于以下几个原因:
如果对于精确的时间控制非常重要,可以考虑使用更精确的时间管理方法,例如使用 requestAnimationFrame 或 setInterval 来实现定时操作。另外,还可以使用第三方库或工具来提供更精确的定时功能,如 lodash 的 debounce 和 throttle 方法。
总之,需要注意 setTimeout 并不是一个完全准确的定时器,它可能会有一些误差。在编写代码时,应该考虑到这些因素,并根据具体需求选择合适的方案。
/**
* @param {number} millis
* @return {Promise}
*/
async function sleep(millis) {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, millis);
});
}
/**
* let t = Date.now()
* sleep(100).then(() => console.log(Date.now() - t)) // 100
*/
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。