参考资料:
非常有意思的一道链式调用。参考资料中使用async和await语法糖完成,更加简介。
此处笔者使用promise的写法。
修改:此处代码有一个错误,当上下两行同步调用时会将任务一起塞进任务队列中
暂时没想到解法。如果有好的解法欢迎留评论告诉我
举个例子
let obj = _Lazyman('Hank');
obj.eat('dinner').sleepFirst(5);
obj.eat('food').sleepFirst(2);
以下是原先代码块
class _Lazyman {
constructor(name) {
this.taskQue = [];
this.timer = null;
}
run() {
if (this.timer) clearTimeout(this.timer);
this.timer = setTimeout(() => {
let promise = Promise.resolve();
this.taskQue.forEach(fn => {
promise = promise.then(v => {
return fn();
})
});
this.taskQue = [];
this.timer = null;
}, 0);
return this;
}
sayHi(name) {
this.taskQue.push(() => {
return new Promise(resolve => {
console.log(`Hello,${name}.`);
resolve();
})
});
this.run();
return this;
}
eat(food) {
this.taskQue.push(() => {
return new Promise(resolve => {
console.log(`eat ${food}.`);
resolve();
})
});
this.run();
return this;
}
sleep(second) {
this.taskQue.push(() => {
return new Promise(resolve => {
console.log(`sleep ${second}s.`);
setTimeout(() => {
resolve();
}, second * 1000);
})
});
this.run();
return this;
}
sleepFirst(second) {
this.taskQue.unshift(() => {
return new Promise(resolve => {
console.log(`sleep ${second}s first.`);
setTimeout(() => {
resolve();
}, second * 1000);
})
});
this.run();
return this;
}
}
let lazyman = name => new _Lazyman(name);
lazyman('Jack').eat('fish').sleepFirst(5).sleep(1).eat('vegetable');