JavaScript实现链式调用

JavaScript链式调用

最近一直在学习JavaScript链式调用这块的东西,所谓的链式调用,简单粗暴的讲,就是在一个实例对象调用完一个方法后,在后边可以一直去调用其他方法,例如,Promise.then()的方法就是一个很好的例子,他可以在后边一直的.then下去。

以下是个人的一些浅理解!!!不是很透彻!!!

那么,链式调用究竟是如何实现的,个人理解:对于同步的链式调用,主要是与对应方法的返回值有关。接下来我们直接上代码

/* 简单的链式调用 */
class Person {
   constructor(name, age) {
     this.name = name
     this.age = age
   }
   info() {
     console.log(`${this.age}${this.name}`);
     return this
   }
   start() {
     console.log('开始起床!');
     return this
   }
   eat() {
     console.log('开始吃饭');
     return this
   }
   school() {
     console.log('开始上学!');
     return this
   }
   sleep() {
     console.log('开始睡觉');
     return this
   }
 }

 const person = new Person('小红', 36)
 person.info().start().eat().school().sleep() 
	//36的小红
	//开始起床!
	//开始吃饭
	//开始上学!
	//开始睡觉

在这里插入图片描述
观察以上的代码,不难发现,在每一个方法上将this返回,也就是指向的是对应的实例对象,然后就可以一直去调用之后的方法。

那么,如果代码中有了一定的异步任务,此时的话,直接返回this是远远不够的,如果直接调用的话,它可能不会按照代码的调用顺序去打印结果,而是按照浏览器的事件循环机制去执行相关代码,接下来我们上代码来看一下:

/* 如果加上异步代码那该如何实现 */
    function Man(name) {
      this.name = name
      // 创建一个数组模拟任务队列
      this.queue = []

      // 用延迟器开启一个事件的总线
      setTimeout(() => {
        // 调用next
        this.next()
      }, 0)

      // 将this返回
      return this
    }

    Man.prototype.next = function () {
      // 将队列中的第一个任务弹出
      let fn = this.queue.shift()
      // 如果有任务的话就进行调用
      fn && fn()
    }
    Man.prototype.sayHello = function () {
      let fn = () => {
        console.log('您好,我叫' + " " + this.name);
        this.next()
      }
      // 将该任务添加到队列当中
      this.queue.push(fn)
      return this
    }
    Man.prototype.eat = function (time) {
      let fn = () => {
        setTimeout(() => {
          console.log(`吃饭花费了 ${time}s`);
        }, time * 1000)
        this.next()
      }
      this.queue.push(fn)
      return this
    }

    let man = new Man('张娜')
    man.sayHello().eat(5)

在这里插入图片描述

以上代码中的eat方法,内容是5s后才输出的。

首先我们创建了一个Man的构造函数,然后在其内部创建了一个数组用来模拟控制异步事件,完后构造函数中的setTimeout是任务队列的事件总线,负责去调用next方法。

在next方法中,我们首先将队列中的第一个任务弹出保存,然后在任务存在的时候去执行它。

然后在每一个对应的方法内部去创建一个函数,用来保存对应的功能,功能函数创建完成后需要将其压入到队列当中,然后将this返回。通过这种方式,然后完成链式的调用!

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值