简单手写 lazyMan
大约 2 分钟
什么是 lazyMan?
可以将 lazyMan 视为一个用于管理和按顺序执行任务的工具。它允许我们定义一系列任务,并确保它们按照特定的顺序执行。
假设你有一系列任务需要按照特定的顺序执行,比如先介绍自己的名字,然后睡觉一段时间,接着吃早餐,再睡一段时间,最后吃午餐。你可以使用 LazyMan 来管理这些任务的顺序执行。
首先,你创建一个 LazyMan 对象,并提供你的名字作为参数。然后你可以链式调用不同的方法来添加任务。例如,使用 sleepFirst 方法来指定首先要睡眠的时间,使用 eat 方法来指定要吃的食物,使用 sleep 方法来指定接下来的睡眠时间。
当你调用这些方法时,实际上是将任务添加到 LazyMan 对象的任务队列中。任务队列按照添加的顺序存储任务,并在适当的时候执行它们。在每个任务执行完成后,LazyMan 会自动执行下一个任务,直到任务队列为空。
这样,LazyMan 就为你提供了一种便捷的方式来管理和按顺序执行任务,而无需手动处理复杂的任务调度和顺序控制。它让你以一种更加简单和直观的方式组织和执行任务。
举一个 js 的应用例子:
// 创建LazyMan对象,并按顺序执行任务
const lazyMan = new LazyMan('John')
lazyMan.sleepFirst(3).eat('Breakfast').sleep(5).eat('Lunch')
代码设计
- 由于有 sleep 功能,因此函数不能直接在调用时触发;
- 初始化一个列表,把函数注册进去;
- 由每个 item 触发 next 执行(遇到 sleep 则异步触发)。
- 编写要点: 任务队列 tasks,何时触发 next,sleep 的异步触发。
/**
* lazy man
* 类编写
*/
class LazyMan {
private name: string
private tasks: Function[] = [] // 任务列表
constructor(name: string) {
this.name = name
setTimeout(() => {
this.next()
})
}
private next() {
const task = this.tasks.shift() // 取出当前 tasks 的头任务
task && task()
}
eat(food: string) {
const task = () => {
console.info('吃:', food)
this.next()
}
this.tasks.push(task)
return this
}
sleep(time: number) {
const task = () => {
console.info(`开始睡${time}秒`)
setTimeout(() => {
this.next()
}, time)
}
this.tasks.push(task)
return this
}
}
// 测试
const lazyMan = new LazyMan('John')
lazyMan.sleep(3).eat('Breakfast').sleep(5).eat('Lunch')
Loading...