js实现lazyman
实现 LazyMan 的功能
LazyMan 是一个经典的 JavaScript 面试题,要求实现一个链式调用的延迟执行队列。核心功能是按顺序执行任务,支持 sleep 等延迟操作。
基本结构
创建一个 LazyMan 类,初始化时传入名称,并维护一个任务队列。任务队列中的函数会依次执行,支持同步和异步操作。

class LazyMan {
constructor(name) {
this.name = name;
this.tasks = [];
setTimeout(() => {
this.next();
}, 0);
}
next() {
const task = this.tasks.shift();
task && task();
}
sleep(time) {
this.tasks.push(() => {
setTimeout(() => {
console.log(`Wake up after ${time} seconds`);
this.next();
}, time * 1000);
});
return this;
}
sleepFirst(time) {
this.tasks.unshift(() => {
setTimeout(() => {
console.log(`Wake up after ${time} seconds`);
this.next();
}, time * 1000);
});
return this;
}
eat(food) {
this.tasks.push(() => {
console.log(`Eat ${food}`);
this.next();
});
return this;
}
}
function lazyMan(name) {
return new LazyMan(name);
}
使用示例
lazyMan('Bob').eat('apple').sleep(3).eat('banana').sleepFirst(2);
输出顺序:

- 等待 2 秒
- 打印 "Wake up after 2 seconds"
- 打印 "Eat apple"
- 等待 3 秒
- 打印 "Wake up after 3 seconds"
- 打印 "Eat banana"
关键点解析
使用任务队列(this.tasks)存储所有待执行函数,通过 next 方法依次触发执行。setTimeout 确保初始化后异步开始执行任务。
sleep 和 sleepFirst 的区别在于任务插入队列的位置:sleep 插入到队列尾部,sleepFirst 插入到队列头部。
每个方法都返回 this 以实现链式调用。






