实现以一个 lazyMan 类,他具有 sleep 和 sleepFist 和 eat方法
- eat 输出正在吃 xx
- sleep 输出睡了 xxx s
- sleepFist 输出 首先睡了 xxx s
例子
let joe = new LazyMan('joe')
joe.eat('apple')
.eat('bananan')
.sleepFisrt(10)
.eat('orange')
.sleep(20)
.eat("pear")
// 应该 等待 10s 输出 apple bananan orange 等待 20s pear
思路
因为有执行的先后顺序,所以要用一个连续的数据结构
1.用
数组来实现sleep和eat是同步执行,只需要 push 到数据尾部即可,sleepFirst是要先执行的,所以使用 数组的unshift方法,
- 因为是执行完第一个方法会自动执行第二个方法,需要一个方法去依次调用数组存储的方法
- 由于是链式调用,需要不断的返回当前
构造函数
- 因为是自动执行,所以需要一个异步函数来执行第一次数组中存储的方法,只有等数组存储了所有的函数,才可以执行,所以是一个异步
代码
class LazyMan {
constructor() {
this.tasks = []
setTimeout(() => {
this.run()
}, 0)
}
sleep(time) {
this.tasks.push(() => {
setTimeout(() => {
console.log(`sleep ${time}`)
this.run()
}, time * 1000)
})
return this
}
sleepFirst(time) {
this.tasks.unshift(() => {
setTimeout(() => {
console.log('slep first')
this.run()
}, time * 1000)
})
return this
}
eat(food) {
this.tasks.push(() => {
console.log(`eat fruit is${food}`)
this.run()
})
return this
}
run() {
let task = this.tasks?.shift();
if (task) {
task()
}
}
}
let lazyman = new LazyMan('tony')
lazyman.eat('apple')
.eat('banana')
.sleepFirst(10)
.eat("orange")
.sleep(5)
.eat("pear")
每天学习一点,现在我认为自己的最大问题是没有一个全局概念,不具备处理 复杂度 比较高的函数或者处理复杂任务的能力