Js实现链式调用和延迟执行

208 阅读1分钟
function arrange(name: string) {
    const tasks = [];

    tasks.push(() => {
        console.log(`${name} is notified`);
    });

    function wait(time: number) {
        tasks.push(
            () =>
                new Promise(resolve => {
                    setTimeout(resolve, time * 1000);
                })
        );
        return this;
    }
    function doSomething(taskName: string) {
        tasks.push(() => console.log(`${taskName} start`));
        return this;
    }
    function waitFirst(time: number) {
        tasks.unshift(
            () =>
                new Promise(resolve => {
                    setTimeout(resolve, time * 1000);
                })
        );
        return this;
    }
    async function execute() {
        //  取出所有任务依次执行
        for (const t of tasks) {
            await t();
        }
        return this;
    }

    return {
        wait,
        do: doSomething,
        waitFirst,
        execute,
    };
}

// 要实现链式调用和延迟调用
// 1. 首先等待三秒 2. 输出姓名 3. 等待5秒 4. 完成事件调用
arrange('zhangsan').wait(5).do('commit').waitFirst(3).execute();