題目介紹
實(shí)現(xiàn)一個(gè) LazyMan,可以按照以下方式調(diào)用:
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
解題思路
首先記錄所需要執(zhí)行的任務(wù),存放在一個(gè)任務(wù)隊(duì)列中,當(dāng)記錄完成后,開始執(zhí)行任務(wù)隊(duì)列。
function LazyMan(name) {
var taskList = []
var task = { // 動(dòng)作
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 = () => { // 執(zhí)行下一件任務(wù)
var fn = taskList.shift()
fn && fn.call()
}
setTimeout(function () { // 記錄任務(wù)完成,開始執(zhí)行任務(wù)
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
}
}
}