你可以遵守你的“任务队列”的承诺,所以任何需要做的事情都会通过添加到那里
.then()
. 这为调度工作提供了一个流畅的API。
function lazyMan(name, logFn) {
logFn(name);
let taskQueue = Promise.resolve();
const addTask = f => {
taskQueue = taskQueue.then(f);
}
return {
eat: function(val) {
addTask(() => console.log(`Eating [${val}]`));
return this;
},
sleep: function(timer) {
addTask(() => new Promise((resolve, reject) => {
console.log(`Start sleeping for ${timer} seconds`);
setTimeout(() => {
console.log(`End sleeping for ${timer} seconds`);
resolve();
}, timer * 1000);
}))
return this;
}
};
}
lazyMan("John", console.log)
.eat("banana")
.sleep(5)
.eat("apple");
请注意,此更改意味着每个操作在技术上都是异步的。然而,这至少是一致的,所以记住这一点的时候就不太可能有惊喜了。