题目
LazyMan('Tony');
// Hi I am Tony
LazyMan('Tony').sleep(10).eat('lunch');
// Hi I am Tony
// 等待了10秒...
// I am eating lunch
LazyMan('Tony').eat('lunch').sleep(10).eat('dinner');
// Hi I am Tony
// I am eating lunch
// 等待了10秒...
// I am eating diner
LazyMan('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>
## 优化
```javascript
class 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");