lazyMan(class)

132 阅读1分钟
         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)