实现 lazyMan 按照以下方式调用
lazyMan("Hank")
打印:"Hi, This is Hank"
lazyMan("Hank").sleep(10).eat('lunch')
- 打印:"Hi, This is Hank"
- 睡了10秒后
- 打印:"Wake up after 10"
- 打印:"eat lunch"
lazyMan("Hank").eat("lunch").eat('dinner')
- 打印:"Hi, This is Hank"
- 打印:"eat lunch"
- 打印:"eat dinner"
lazyMan("Hank").sleepFirst(5).eat('lunch')
- 睡了5秒后
- 打印:"Wake up after 5"
- 打印:"Hi, This is Hank"
- 打印:"eat lunch"
1. 实现第一个调用
function lazyMan(name){
console.log(`Hi, This is ${name}`)
}
2. 实现第二个调用
function lazyMan(name){
console.log(`Hi, This is ${name}`)
const api = {
sleep(second){
const now = new Date()
while(new Date() - now < (second * 1000)){}
console.log(`Wake up after ${second}`)
return api
},
eat(type){
console.log(`eat ${type}`)
return api
}
}
}
至此前三个需求都可以满足,但是到了第四个的时候,你之前写的代码得全部推翻了
3. 最终版
使用队列,先进先出
function lazyMan(name) {
const queue = []
const next = () => {
const currentTask = queue.shift()
currentTask && currentTask()
}
const sayHi = () => {
console.log(`Hi,This ${name}`)
next()
}
queue.push(sayHi)
const api = {
sleep(second) {
const task = () => {
setTimeout(() => {
console.log(`Wake up after ${second}`)
next()
}, second * 1000)
}
queue.push(task)
return api
},
eat(type) {
const task = () => {
console.log(`eat ${type}`)
next()
}
queue.push(task)
return api
},
sleepFirst(second) {
const task = () => {
setTimeout(() => {
console.log(`Wake up after ${second}`)
next()
}, second * 1000)
}
queue.unshift(task)
return api
}
}
setTimeout(() => next(), 0)
return api
}