SOURCE

const compose = fnArray => {
    let index = -1
    return dispatch(0)
    function dispatch(i) {
        if (i <= index) return Promise.reject(new Error('next() called multiple times'))
        index = i
        const fn = fnArray[i]
        if (!fn) return Promise.resolve()
        try {
            return Promise.resolve(fn(() => dispatch(i + 1)))
        } catch (err) {
            return Promise.reject(err)
        }
    }
}

const wait = (ms = 1000) => new Promise(resolve => setTimeout(resolve, ms))
compose([
    async (next) => {
        console.log('1---start')
        await next()
        // await next()
        console.log('1---end')
    },
    async (next) => {
        console.log('2---start')
        await wait()
        next()
        console.log('2---end')
    },
    (next) => {
        console.log('3---start')
        console.log('3---end')
    },
]).then(() => {
    console.log('done')
}).catch((err) => {
    console.log(err)
})
console 命令行工具 X clear

                    
>
console