LazyMan

107 阅读1分钟

实现 lazyMan 按照以下方式调用

  1. lazyMan("Hank")

打印:"Hi, This is Hank"

  1. lazyMan("Hank").sleep(10).eat('lunch')
  1. 打印:"Hi, This is Hank"
  2. 睡了10秒后
  3. 打印:"Wake up after 10"
  4. 打印:"eat lunch"
  1. lazyMan("Hank").eat("lunch").eat('dinner')
  1. 打印:"Hi, This is Hank"
  2. 打印:"eat lunch"
  3. 打印:"eat dinner"
  1. lazyMan("Hank").sleepFirst(5).eat('lunch')
  1. 睡了5秒后
  2. 打印:"Wake up after 5"
  3. 打印:"Hi, This is Hank"
  4. 打印:"eat lunch"

1. 实现第一个调用

function lazyMan(name){
    console.log(`Hi, This is ${name}`)
}

2. 实现第二个调用

function lazyMan(name){
    console.log(`Hi, This is ${name}`)
    const api = {
        sleep(second){
            const now = new Date()
            while(new Date() - now < (second * 1000)){}
            console.log(`Wake up after ${second}`)
            return api
        },
        eat(type){
            console.log(`eat ${type}`)
            return api
        }
    }
}

至此前三个需求都可以满足,但是到了第四个的时候,你之前写的代码得全部推翻了

3. 最终版

使用队列,先进先出

function lazyMan(name) {
  const queue = []
  const next = () => {
    const currentTask = queue.shift()
    currentTask && currentTask()
  }
  const sayHi = () => {
    console.log(`Hi,This ${name}`)
    next()
  }
  queue.push(sayHi)
  const api = {
    sleep(second) {
      const task = () => {
        setTimeout(() => {
          console.log(`Wake up after ${second}`)
          next()
        }, second * 1000)
      }
      queue.push(task)
      return api
    },
    eat(type) {
      const task = () => {
        console.log(`eat ${type}`)
        next()
      }
      queue.push(task)
      return api
    },
    sleepFirst(second) {
      const task = () => {
        setTimeout(() => {
          console.log(`Wake up after ${second}`)
          next()
        }, second * 1000)
      }
      queue.unshift(task)
      return api
    }
  }
  setTimeout(() => next(), 0)
  return api
}