js实现lazyman
实现 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 确保所有方法调用完成后再开始执行任务。

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 到链开头实现优先执行。两种实现方式各有优劣,可根据具体需求选择。






