当前位置:首页 > 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实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js 实现分页

js 实现分页

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

js实现授权

js实现授权

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

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…