JavaScrip实现一个睡眠函数

发布时间:2024年01月14日

说在前面

🎈在 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 对象

提示:

  • 1 <= millis <= 1000

解题思路

函数内部,它返回一个 Promise 对象。该 Promise 在指定的毫秒数后会被解析(resolve)。

通过调用 setTimeout 函数,我们在指定的毫秒数后调用 resolve 函数,从而解析 Promise。

示例中给出了如何使用 sleep 函数来实现延迟操作。通过调用 sleep(100),我们创建了一个等待 100 毫秒的 Promise。然后,通过调用 .then() 方法,我们设置了当 Promise 解析后的回调函数,它会打印出从等待开始到回调执行时的时间差。

注意

setTimeout 函数存在一定的误差,因为它依赖于浏览器或 Node.js 的事件循环机制。这意味着在某些情况下,setTimeout 可能会比预期的时间稍微早或稍微晚一些执行。

这种误差主要由于以下几个原因:

  • 1、系统负载:如果系统负载较高,事件循环可能无法及时调用 setTimeout 中指定的回调函数。
  • 2、其他任务的阻塞:如果在 setTimeout 回调函数执行之前有其他耗时的任务正在进行,那么 setTimeout 的执行可能会被延迟。
  • 3、最小延迟时间:在浏览器环境中,setTimeout 的最小延迟时间通常是 4 毫秒(不同浏览器可能有所不同),这意味着设置更小的延迟时间也会被自动调整为最小延迟时间。

如果对于精确的时间控制非常重要,可以考虑使用更精确的时间管理方法,例如使用 requestAnimationFrame 或 setInterval 来实现定时操作。另外,还可以使用第三方库或工具来提供更精确的定时功能,如 lodash 的 debounce 和 throttle 方法。

总之,需要注意 setTimeout 并不是一个完全准确的定时器,它可能会有一些误差。在编写代码时,应该考虑到这些因素,并根据具体需求选择合适的方案。

AC代码

/**
 * @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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

文章来源:https://blog.csdn.net/Twinkle_sone/article/details/135583250
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。