关于javascript:JavaScript实现链式调用

36次阅读

共计 1557 个字符,预计需要花费 4 分钟才能阅读完成。

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 返回。通过这种形式,而后实现链式的调用!

正文完
 0