简单手写 lazyMan
大约 2 分钟
什么是 lazyMan?
可以将 lazyMan 视为一个用于管理和按顺序执行任务的工具。它允许我们定义一系列任务,并确保它们按照特定的顺序执行。
假设你有一系列任务需要按照特定的顺序执行,比如先介绍自己的名字,然后睡觉一段时间,接着吃早餐,再睡一段时间,最后吃午餐。你可以使用 LazyMan 来管理这些任务的顺序执行。
首先,你创建一个 LazyMan 对象,并提供你的名字作为参数。然后你可以链式调用不同的方法来添加任务。例如,使用 sleepFirst 方法来指定首先要睡眠的时间,使用 eat 方法来指定要吃的食物,使用 sleep 方法来指定接下来的睡眠时间。
当你调用这些方法时,实际上是将任务添加到 LazyMan 对象的任务队列中。任务队列按照添加的顺序存储任务,并在适当的时候执行它们。在每个任务执行完成后,LazyMan 会自动执行下一个任务,直到任务队列为空。
这样,LazyMan 就为你提供了一种便捷的方式来管理和按顺序执行任务,而无需手动处理复杂的任务调度和顺序控制。它让你以一种更加简单和直观的方式组织和执行任务。
举一个 js 的应用例子:
// 创建LazyMan对象,并按顺序执行任务
const lazyMan = new LazyMan('John')
lazyMan.sleep(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')
进阶一点,实现一个简易的“类 SQL” 查询器:
function findSQL(data) {
return new Query(data)
}
class Query {
constructor(data) {
this._value = [...(data ?? [])]
}
get value() {
return this._value
}
where(condition) {
this._value = this._value.filter((item) => {
return Object.keys(condition).every((key) => {
const rule = condition[key]
const target = item[key]
return rule.test(target)
})
})
return this
}
orderBy(field, direction = 'asc') {
this._value.sort((a, b) => {
const v1 = a[field]
const v2 = b[field]
if (v1 === v2) return 0
if (direction === 'asc') {
return v1 > v2 ? 1 : -1
} else {
return v1 > v2 ? -1 : 1
}
})
return this
}
}
Loading...
