简单手写 lazyMan

Huy大约 2 分钟javascriptjavascript

什么是 lazyMan?

可以将 lazyMan 视为一个用于管理和按顺序执行任务的工具。它允许我们定义一系列任务,并确保它们按照特定的顺序执行。

假设你有一系列任务需要按照特定的顺序执行,比如先介绍自己的名字,然后睡觉一段时间,接着吃早餐,再睡一段时间,最后吃午餐。你可以使用 LazyMan 来管理这些任务的顺序执行。

首先,你创建一个 LazyMan 对象,并提供你的名字作为参数。然后你可以链式调用不同的方法来添加任务。例如,使用 sleepFirst 方法来指定首先要睡眠的时间,使用 eat 方法来指定要吃的食物,使用 sleep 方法来指定接下来的睡眠时间。

当你调用这些方法时,实际上是将任务添加到 LazyMan 对象的任务队列中。任务队列按照添加的顺序存储任务,并在适当的时候执行它们。在每个任务执行完成后,LazyMan 会自动执行下一个任务,直到任务队列为空。

这样,LazyMan 就为你提供了一种便捷的方式来管理和按顺序执行任务,而无需手动处理复杂的任务调度和顺序控制。它让你以一种更加简单和直观的方式组织和执行任务。

举一个 js 的应用例子:

// 创建LazyMan对象,并按顺序执行任务
const lazyMan = new LazyMan('John')
lazyMan.sleepFirst(3).eat('Breakfast').sleep(5).eat('Lunch')

代码设计

  • 由于有 sleep 功能,因此函数不能直接在调用时触发;
  • 初始化一个列表,把函数注册进去;
  • 由每个 item 触发 next 执行(遇到 sleep 则异步触发)。
  • 编写要点: 任务队列 tasks,何时触发 next,sleep 的异步触发。
/**
 * lazy man
 * 类编写
 */

class LazyMan {
  private name: string
  private tasks: Function[] = [] // 任务列表

  constructor(name: string) {
    this.name = name
    setTimeout(() => {
      this.next()
    })
  }

  private next() {
    const task = this.tasks.shift() // 取出当前 tasks 的头任务
    task && task()
  }

  eat(food: string) {
    const task = () => {
      console.info('吃:', food)
      this.next()
    }
    this.tasks.push(task)
    return this
  }

  sleep(time: number) {
    const task = () => {
      console.info(`开始睡${time}`)
      setTimeout(() => {
        this.next()
      }, time)
    }
    this.tasks.push(task)
    return this
  }
}

// 测试
const lazyMan = new LazyMan('John')
lazyMan.sleep(3).eat('Breakfast').sleep(5).eat('Lunch')
Loading...