当前位置:首页 > JavaScript

js实现lazyman

2026-03-14 22:21:16JavaScript

实现 LazyMan 的功能

LazyMan 是一个经典的 JavaScript 面试题,要求实现一个链式调用的延迟执行队列。具体功能包括:

  • 延迟执行任务
  • 支持链式调用
  • 支持睡眠功能
  • 任务按顺序执行

基本实现思路

创建一个 LazyMan 类,维护一个任务队列,通过 Promise 或 setTimeout 实现异步控制。每次调用方法时将任务加入队列,并在适当时候触发执行。

代码实现

class LazyMan {
  constructor(name) {
    this.name = name
    this.taskQueue = []
    console.log(`Hi I am ${name}`)

    // 使用 setTimeout 确保所有方法调用后再执行任务
    setTimeout(() => {
      this.next()
    }, 0)
  }

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

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

  sleep(time) {
    const task = () => {
      setTimeout(() => {
        console.log(`等待了${time}秒...`)
        this.next()
      }, time * 1000)
    }
    this.taskQueue.push(task)
    return this
  }

  sleepFirst(time) {
    const task = () => {
      setTimeout(() => {
        console.log(`优先等待了${time}秒...`)
        this.next()
      }, time * 1000)
    }
    this.taskQueue.unshift(task) // 插入到队列开头
    return this
  }
}

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

使用示例

lazyMan('Tony').eat('lunch').eat('dinner').sleepFirst(5).sleep(10).eat('junk food')

// 输出顺序:
// Hi I am Tony
// 等待了5秒...
// I am eating lunch
// I am eating dinner
// 等待了10秒...
// I am eating junk food

实现要点

使用任务队列存储所有待执行的操作,通过 next 方法控制执行流程。sleepFirst 通过 unshift 方法将任务插入队列开头实现优先执行。setTimeout 确保所有方法调用完成后再开始执行任务。

js实现lazyman

Promise 版本实现

class LazyMan {
  constructor(name) {
    this.name = name
    this.promise = Promise.resolve()
    console.log(`Hi I am ${name}`)
  }

  eat(food) {
    this.promise = this.promise.then(() => {
      console.log(`I am eating ${food}`)
    })
    return this
  }

  sleep(time) {
    this.promise = this.promise.then(() => {
      return new Promise(resolve => {
        setTimeout(() => {
          console.log(`等待了${time}秒...`)
          resolve()
        }, time * 1000)
      })
    })
    return this
  }

  sleepFirst(time) {
    const prevPromise = this.promise
    this.promise = new Promise(resolve => {
      setTimeout(() => {
        console.log(`优先等待了${time}秒...`)
        resolve()
      }, time * 1000)
    }).then(() => prevPromise)
    return this
  }
}

Promise 版本利用 Promise 链式调用特性,sleepFirst 通过插入新的 Promise 到链开头实现优先执行。两种实现方式各有优劣,可根据具体需求选择。

标签: jslazyman
分享给朋友:

相关文章

js实现继承

js实现继承

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

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <htm…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…