链式调用的 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,让链式调用得以顺序触发。



