实现一个 lazyMan

361 阅读1分钟

实现以一个 lazyMan 类,他具有 sleepsleepFisteat方法

  1. eat 输出正在吃 xx
  2. sleep 输出睡了 xxx s
  3. sleepFist 输出 首先睡了 xxx s

例子

let joe = new LazyMan('joe')
joe.eat('apple')
    .eat('bananan')
    .sleepFisrt(10)
    .eat('orange')
    .sleep(20)
    .eat("pear")
 // 应该 等待 10s 输出 apple bananan  orange 等待 20s pear

思路

因为有执行的先后顺序,所以要用一个连续的数据结构

1.用 数组 来实现 sleepeat 是同步执行,只需要 push 到数据尾部即可, sleepFirst 是要先执行的,所以使用 数组的 unshift方法,

  1. 因为是执行完第一个方法会自动执行第二个方法,需要一个方法去依次调用数组存储的方法
  1. 由于是链式调用,需要不断的返回当前 构造函数
  1. 因为是自动执行,所以需要一个异步函数来执行第一次数组中存储的方法,只有等数组存储了所有的函数,才可以执行,所以是一个异步

代码

    class LazyMan {
      constructor() {
        this.tasks = []
        setTimeout(() => {
          this.run()
        }, 0)
      }

      sleep(time) {
        this.tasks.push(() => {
          setTimeout(() => {
            console.log(`sleep ${time}`)
            this.run()
          }, time * 1000)
        })

        return this
      }

      sleepFirst(time) {
        this.tasks.unshift(() => {
          setTimeout(() => {
            console.log('slep first')
            this.run()
          }, time * 1000)
        })

        return this
      }

      eat(food) {
        this.tasks.push(() => {
          console.log(`eat fruit is${food}`)
          this.run()
        })

        return this
      }

      run() {
        let task = this.tasks?.shift();
        if (task) {
          task()
        }
      }
    }

    let lazyman = new LazyMan('tony')
        lazyman.eat('apple')
                .eat('banana')
                .sleepFirst(10)
                .eat("orange")
                .sleep(5)
                .eat("pear")

每天学习一点,现在我认为自己的最大问题是没有一个全局概念,不具备处理 复杂度 比较高的函数或者处理复杂任务的能力