当前位置:首页 > JavaScript

js实现lazyman

2026-02-01 23:00:10JavaScript

实现 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 的事件循环机制和队列数据结构,可以灵活地处理各种延迟执行的场景。

js实现lazyman

标签: jslazyman
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div c…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEv…