题目
LazyMan('Tony');// Hi I am TonyLazyMan('Tony').sleep(10).eat('lunch');// Hi I am Tony// 等待了10秒...// I am eating lunchLazyMan('Tony').eat('lunch').sleep(10).eat('dinner');// Hi I am Tony// I am eating lunch// 等待了10秒...// I am eating dinerLazyMan('Tony').eat('lunch').eat('dinner').sleepFirst(5).sleep(10).eat('junk food');// Hi I am Tony// 等待了5秒...// I am eating lunch// I am eating dinner// 等待了10秒...// I am eating junk food
思路
- 一个class
- 一个taskList
- push任务
-
结果
```javascript class Lazy { name; isExec = false; taskList = [];
constructor(name) { this.name = name; console.log(
Hi I am ${name})
}
async exec() { if (this.taskList.length > 0) { console.log(“exec”); await this.taskList.shift()(); setTimeout(() => { this.exec(); }, 0); } else { this.isExec = false; } }
sleepFirst(time) {
const fn = function () {
return new Promise((res) => {
setTimeout(() => {
res();
console.log(${time}s gone);
}, time * 1000);
});
};
console.log("push sleep");this.taskList.unshift(fn);return this;
}
sleep(time) {
const fn = function () {
return new Promise((res) => {
setTimeout(() => {
res();
console.log(${time}s gone);
}, time * 1000);
});
};
console.log("push sleep");this.taskList.push(fn);return this;
}
eat(name) {
const fn = function () {
return new Promise((res) => {
setTimeout(() => {
res();
console.log(I am eating ${name});
}, 1);
});
};
console.log("push eat");this.taskList.push(fn);if (!this.isExec) {this.isExec = true;setTimeout(() => {console.log("exec --");this.exec();}, 0);}return this;
} }
function LazyMan(name) { return new Lazy(name); }
// LazyMan(“Tony”); // LazyMan(“Tony”).sleep(1).eat(“lunch”); // LazyMan(“Tony”).eat(“lunch”).sleep(3).eat(“dinner”); LazyMan(“Tony”) .eat(“lunch”) .eat(“dinner”) .sleepFirst(5) .sleep(10) .eat(“junk food”);
<a name="FOEDj"></a>## 优化```javascriptclass Lazy {name;taskList = [];constructor(name) {this.name = name;console.log(`Hi I am ${name}`);setTimeout(() => {this.next();}, 0);}next() {const fn = this.taskList.shift();fn && fn();}sleepFirst(time) {const fn = () => {setTimeout(() => {console.log(`${time}s gone`);this.next();}, time * 1000);};this.taskList.unshift(fn);return this;}sleep(time) {const fn = () => {setTimeout(() => {console.log(`${time}s gone`);this.next();}, time * 1000);};this.taskList.push(fn);return this;}eat(name) {const fn = () => {console.log(`I am eating ${name}`);this.next();};this.taskList.push(fn);return this;}}function LazyMan(name) {return new Lazy(name);}// LazyMan("Tony");// LazyMan("Tony").sleep(1).eat("lunch");// LazyMan("Tony").eat("lunch").sleep(3).eat("dinner");LazyMan("Tony").eat("lunch").eat("dinner").sleepFirst(5).sleep(10).eat("junk food");
