题目介绍
实现一个 LazyMan,可以按照以下方式调用:
LazyMan("Hank") 输出:
Hi! This is Hank!
LazyMan("Hank").sleep(10).eat("dinner") 输出
Hi! This is Hank!
// 等待 10 秒..
Wake up after 10
Eat dinner~
LazyMan("Hank").eat("dinner").eat("supper") 输出
Hi This is Hank!
Eat dinner~
Eat supper~
LazyMan("Hank").sleepFirst(5).eat("supper") 输出
// 等待 5 秒
Wake up after 5
Hi This is Hank!
Eat supper
解题思路
首先记录所需要执行的任务,存放在一个任务队列中,当记录完成后,开始执行任务队列。
function LazyMan(name) {
var taskList = []
var task = { // 动作
wait(second) { // 等待
return () => {
console.log(`Wake up after ${second}`)
setTimeout(() => {
next()
}, second * 1000)
}
},
eat(part) { // 吃
return () => {
console.log(`Eat ${part}~`)
next()
}
},
say() { // 说
console.log(`Hi! This is ${name}!`)
next()
}
}
taskList.push(task.say)
let next = () => { // 执行下一件任务
var fn = taskList.shift()
fn && fn.call()
}
setTimeout(function () { // 记录任务完成,开始执行任务
next()
}, 0)
return { // 暴露接口
sleep(second) {
taskList.push(task.wait(second))
return this
},
sleepFirst(second) {
taskList.unshift(task.wait(second))
return this
},
eat(part) {
taskList.push(task.eat(part))
return this
}
}
}