class LazyMan {
constructor() {
this.events = [];
setTimeout(() => {
this.clear();
}, 0);
}
eat() {
this.events.push({
type: 'sync',
fn: () => { console.log("eat"); }
})
return this;
}
run() {
this.events.push({
type: 'sync',
fn: () => { console.log("run"); }
})
return this;
}
sleep(t) {
this.events.push({
type: 'async',
fn: () => {
return new Promise((resolve) => {
setTimeout(() => {
console.log(`sleep ${t}s done`);
resolve();
}, t * 1000);
});
}
})
return this;
}
first(t) {
this.events.push({
type: 'async',
first: true,
fn: () => {
return new Promise((resolve) => {
setTimeout(() => {
console.log(`first ${t}s done`);
resolve();
}, t * 1000);
});
}
})
return this;
}
async clear() {
this.events = [...this.events.filter(o => o.first), ...this.events.filter(o => !o.first)];
for (const item of this.events) {
if (item.type === 'sync') {
item.fn();
} else {
await item.fn();
}
}
}
}
let tom = new LazyMan();
tom.sleep(1).eat().run().sleep(2).eat().first(2);
console.log(tom)