链式调用的 Promise 队列

实现 new Human("xx").sleep(3).eat(2).sleep(1) 这种链式调用,关键点是 sleep/eat 返回 this,并且内部把任务挂到 this.queue 这个 Promise 链上依次执行。

class Human {
  constructor(name) {
    this.name = name;
    this.sayHello();
    this.queue = Promise.resolve();
  }

  sayHello() {
    console.log(`${this.name}, 你好啊!`)
  }

  sleep(time) {
    this.queue = this.queue.then(() => {
      return new Promise((resolve) => {
        setTimeout(() => {
          console.log("Sleep " + time);
          resolve();
        }, time * 1000);
      });
    });
    return this;
  }

  eat(time) {
    this.queue = this.queue.then(() => {
      return new Promise(resolve => {
        setTimeout(() => {
          console.log("eat " + time);
          resolve();
        }, time * 1000)
      })
    });
    return this;
  }
}
// 用法示例:
new Human("张三")
  .sleep(2) // 等待 2 秒
  .eat(3)   // 再等待 3 秒
  .sleep(1); // 再等待 1 秒

补充

补充:this.queue = this.queue.then(...) 是「Promise 串行队列」的标准写法:每次调用都把新 Promise 接到队尾,并把队尾返回给 this,让链式调用得以顺序触发。