当前位置:首页 > JavaScript

js实现lazyman

2026-02-01 23:00:10JavaScript

js实现lazyman

js实现lazyman

实现 LazyMan

LazyMan 是一个经典的 JavaScript 面试题,要求实现一个链式调用的延迟执行队列。以下是一种实现方式:

class LazyMan {
  constructor(name) {
    this.name = name;
    this.tasks = [];
    console.log(`Hi I am ${this.name}`);
    setTimeout(() => {
      this.next();
    }, 0);
  }

  next() {
    const task = this.tasks.shift();
    task && task();
  }

  sleep(time) {
    const fn = () => {
      setTimeout(() => {
        console.log(`Wake up after ${time} seconds`);
        this.next();
      }, time * 1000);
    };
    this.tasks.push(fn);
    return this;
  }

  sleepFirst(time) {
    const fn = () => {
      setTimeout(() => {
        console.log(`Wake up after ${time} seconds`);
        this.next();
      }, time * 1000);
    };
    this.tasks.unshift(fn);
    return this;
  }

  eat(food) {
    const fn = () => {
      console.log(`I am eating ${food}`);
      this.next();
    };
    this.tasks.push(fn);
    return this;
  }
}

function lazyMan(name) {
  return new LazyMan(name);
}

使用示例

lazyMan('Tom').eat('lunch').sleep(2).eat('dinner').sleepFirst(3);

// 输出顺序:
// Hi I am Tom
// (等待3秒)
// Wake up after 3 seconds
// I am eating lunch
// (等待2秒)
// Wake up after 2 seconds
// I am eating dinner

实现原理

  1. 使用任务队列存储所有待执行的方法
  2. 通过 setTimeout 实现异步调用,确保链式调用完成后才开始执行
  3. sleepFirst 通过 unshift 方法将任务插入队列头部
  4. 每个任务完成后调用 next 方法触发下一个任务

注意事项

  1. 构造函数中使用 setTimeout 确保链式调用完成后再开始执行任务
  2. 每个方法返回 this 以实现链式调用
  3. 任务执行完成后必须调用 next 方法继续执行后续任务

这种实现方式利用了 JavaScript 的事件循环机制和队列数据结构,可以灵活地处理各种延迟执行的场景。

标签: jslazyman
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…