要求设计 LazyMan 类,实现以下功能

97 阅读1分钟

分析一下考察的执行顺序先是tony的name方法,然后是等待了5秒的sleepFrist方法,然后是eat,然后是等待了10秒的sleep方法,最后是eat方法。
由此可见,name方法是立即执行的,然后是sleepFrist,其他的按照顺序执行。

LazyMan('Tony');
// Hi I am Tony
LazyMan('Tony').sleep(10).eat('lunch');
// Hi I am Tony
// 等待了10 秒...
// I am eating
lunchLazyMan('Tony').eat('lunch').sleep(10).eat('dinner');
// Hi I am Tony
// I am eating lunch// 等待了10 秒...
// I am eating
dinerLazyMan('Tony').eat('lunch').eat('dinner').sleepFirst(5).sleep(10).eat('junk food');
// Hi I am Tony// 等待了5 秒...
// I am eating lunch
// I am eating dinner
// 等待了10 秒...
// I am eating junk food

定义一个类,把任务添加到任务列表,每一个方法调用判断是否有任务,有就继续执行

class LazyManClass {
    constructor(name) {//定义构造函数
        this.name = name
        this.taskList = []//定义执行的任务顺序列表
        console.log(`Hi I am ${name}`)
        setTimeout(() => {
            this.next()
        },0)
}
sleepFirst(time) {
    const fn = () => {
        setTimeout(() => {
            console.log(`等待了${time}秒...`)
            this.next()
        }, time)
}
    this.taskList.unshift(fn)//把sleepFrist放在最先执行的位置
    return this
}
sleep(time) {
    const fn = () => {
        setTimeout(() => {
            console.log(`等待了${time}秒...`)
            this.next()
        },time)
}
    this.taskList.push(fn)//eat和sleep按照顺序添加进任务列表
    return this
}
eat(food) {
    const fn = () => {
        console.log(`I am eating ${food}`)
        this.next()
}
    this.taskList.push(fn)
    return this
}
next() {
    const fn = this.taskList.shift()
    fn && fn()//如果有fn就执行fn(),相当于if(fn){fn()}
}
}
function LazyMan(name) {
    return new LazyManClass(name)
}