美文网首页
经典链式调用 Person("Dan").sleep(2).ea

经典链式调用 Person("Dan").sleep(2).ea

作者: Allan要做活神仙 | 来源:发表于2023-04-22 17:11 被阅读0次

实现:

// Person('Li')
/* 输出:
Hi! This is Hank!
*/
// Person('Dan').sleep(3).eat('dinner')
/* 输出:
Hi! This is Hank!
// 等待10秒..
Wake up after 10
Eat dinner~
*/
// Person('Jerry').eat('dinner~').eat('supper~')
/* 输出:
Hi This is Hank!
Eat dinner~
Eat supper~
*/
Person('Smith').sleepFirst(2).eat('supper')
/* 等待5秒,输出
Wake up after 5
Hi This is Hank!
Eat supper
*/

解答

function Person(name) {
  return new CreatePerson(name)
}

class CreatePerson {
  constructor(name){
    this.tasks = [] // 核心,使用队列(数组)来存储要执行的函数
    this.tasks.push(()=> console.log(`Hi! This is ${name}`))

    this.runTask()
  }

  runTask() {
    // 关键!利用宏任务将事件延迟执行
    // 如果遇到 sleepFirst,可以先将 sleepFirst 压入任务队列,然后按顺序执行
    setTimeout(() => this.exector())
  }

  exector() {
    if(this.tasks.length === 0) return // 递归出口

    const task = this.tasks.shift() // 取出任务

    if(typeof task === "number") {
      setTimeout(() => {
        console.log(`Wake up after ${task}`)
        this.exector() // 递归自身
      }, 2000)
    }
    
    if (typeof task === 'function') {
      task()
      this.exector() // 递归自身
    }

    return this
  }

  // 维护各种任务,用任务队列存储
  eat(food) {
    this.tasks.push(() => console.log(`Eat ${food}~`)) // 常规操作,塞进任务队列
    return this
  }

  sleep(time) {
    this.tasks.push(time) // 常规操作,塞进任务队列
    return this
  }

  sleepFirst(time) {
    console.log(1);
    this.tasks.unshift(time) // 执行:塞进第一项!
    return this
  }
}

相关文章

  • 链式编程

    .h - (Person*)eat2; - (Person*)sleep2; - (Person* (^)(voi...

  • 自制jquery-第一篇

    1, jquery.js脚本文件 2,实现链式调用的原理 非链式调用:$xxx.addClass("active"...

  • swift重温笔记(可选链式调用)

    使用可选链式调用代替强制展开 为可选链式调用定义模型类 通过可选链式调用访问属性 通过可选链式调用调用方法 通过可...

  • java:设计思想总结

    随着写代码越来越多,感觉整个架构设计还是挺重要的。记录一下 一.链式调用思想 发现很多架构都使用链式调用,最经典就...

  • 你一定不知道的链式调用新姿势

    如何链式调用Java静态方法? 链式调用 首先需要提一下最近几年在开发界大的链式调用,链式调用非常利于编写,更利于...

  • 你一定不知道的Java链式调用新姿势

    链式调用 首先需要提一下最近几年在开发界大的链式调用,链式调用非常利于编写,更利于阅读,那么,什么是链式调用呢,为...

  • 2022-03-07 笔试总结

    使用原型链或 class ,实现加减乘除的链式调用重点1: 链式调用 .fun1().fun2().fun3()重...

  • Kotlin学习7-内置函数

    1:apply内置函数,返回本身,链式调用 2:let内置函数,仅展开,无法链式调用,不返回自己,返回最后一行,匿...

  • 链式调用原理

    常规写法: 链式调用: 实现原理: 调用方法之后返回自己,以实现链式调用 具体代码:

  • 八(2)Promise模拟(姜) ------ 2020-05-

    1、基础的Promise的实现 2、实现then的链式调用

网友评论

      本文标题:经典链式调用 Person("Dan").sleep(2).ea

      本文链接:https://www.haomeiwen.com/subject/svwsjdtx.html