面试题LazyMan

761 阅读1分钟

LazyMan

最近遇到的一到面试题,时间限制没完整答出来,回去之后写出来发现实现的不够优雅

题目:

实现一个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~

以此类推.

题目分析:

  • 实现一个打印名字的方法
  • 实现sleep、eat、sleepFirst方法
  • 实现链式调用,实现的方法应该返回this
  • sleepFirst方法可以插队

实现代码

let index = 0 // 当前执行任务的下标 
let stack = [] // 任务队列
function next () { // 执行下一个任务
    let fn = stack[index]
    index++
    if (typeof fn === 'function') {
        fn()
    }
}

function Man (name) {
    stack.push(function () {
        console.log(`Hi This is ${name}!`)
        next();
    })
}


var LazyMan = function (name) {
    return new Man(name)
}

// 定义sleep函数
Man.prototype.sleep = function (time) {
    stack.push(function () {
        setTimeout(function () {
            console.log(`Wake up after ${time}`)
            next()
        }, time *1000)
    })
    return this
}

// 定义eat函数
Man.prototype.eat = function (food) {
        stack.push(function () {
            console.log(`Eat ${food}~`)
            next()
        })
        return this
}

// 定义sleepFirst函数
Man.prototype.sleepFirst = function (time) {
    // 实现插队
    stack.unshift(function () {
        setTimeout(function () {
            console.log('wake up after '+ time + '秒')
            next()
        }, time *1000)
    })
    return this;
}
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~
next()

感觉我的实现还是用了很多代码,不知道你有没有更简单的实现方式。欢迎分享!