LazyMan的实现

2017-08-30  本文已影响0人  调皮的小卷羊

题目介绍

实现一个 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
                }
            }
        }
上一篇下一篇

猜你喜欢

热点阅读