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