实现一个 sleep 函数

发布于 2025-01-31 00:13:16 字数 2657 浏览 10 评论 0

在 JavaScript 中实现一个 sleep 函数,可以利用 PromisesetTimeoutsleep 函数通常用于让代码暂停一段时间。以下是如何实现一个 sleep 函数:

1. 基本实现

这个实现使用 PromisesetTimeout ,使得可以在异步函数中进行“睡眠”操作。

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

// 使用示例
async function example() {
  console.log('Start');
  await sleep(2000); // 等待 2 秒
  console.log('End');
}

example();

2. 解释

  • sleep 函数 :接收一个参数 ms ,表示要等待的时间(以毫秒为单位)。返回一个 Promise 对象,在 Promise 内部,使用 setTimeout 实现等待。 setTimeout 在指定时间后调用 resolve ,从而使 Promise 状态变为已解决(fulfilled)。
  • example 函数 :一个示例函数,演示如何使用 await 等待 sleep 函数的完成。 await 使得代码在 sleep 函数返回之前暂停执行。

3. 更复杂的用例(添加取消功能)

有时你可能希望能在 sleep 操作中添加取消的功能。以下是一个更复杂的示例,演示如何实现可取消的 sleep 函数。

class CancelableSleep {
  constructor(ms) {
    this.ms = ms;
    this.cancelled = false;
  }

  sleep() {
    return new Promise((resolve, reject) => {
      const timeoutId = setTimeout(() => {
        if (!this.cancelled) {
          resolve();
        }
      }, this.ms);

      // 取消功能
      this.cancel = () => {
        this.cancelled = true;
        clearTimeout(timeoutId);
        reject(new Error('Sleep canceled'));
      };
    });
  }
}

// 使用示例
async function example() {
  const cancelableSleep = new CancelableSleep(5000); // 5 秒
  const sleepPromise = cancelableSleep.sleep();

  setTimeout(() => {
    cancelableSleep.cancel(); // 在 2 秒后取消
  }, 2000);

  try {
    await sleepPromise;
    console.log('Finished sleeping');
  } catch (e) {
    console.error(e.message);
  }
}

example();

4. 解释

  • CancelableSleep :封装了一个可取消的睡眠操作。构造函数接收一个等待时间 ms ,并提供一个 sleep 方法返回一个 Promisecancel 方法用于取消等待。
  • example 函数 :演示了如何使用 CancelableSleep 类。创建一个 CancelableSleep 实例,并在 2 秒后调用 cancel 方法来取消睡眠操作。注意,使用 await 时需要处理可能的取消错误。

总结

  • 基本的 sleep 函数利用 PromisesetTimeout 实现异步等待。
  • 复杂用例中,可以扩展 sleep 函数以支持取消操作,通过 Promise 的 reject 方法处理取消情况。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

断舍离

暂无简介

文章
评论
27 人气
更多

推荐作者

夢野间

文章 0 评论 0

百度③文鱼

文章 0 评论 0

小草泠泠

文章 0 评论 0

zhuwenyan

文章 0 评论 0

weirdo

文章 0 评论 0

坚持沉默

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文