JavaScript/TypeScriptの非同期処理を順番に実行する関数

非同期処理を実行する関数を配列で渡して、その関数を順番に実行する。reject された場合はfalse、すべて resolve だった場合は true を返す。resolve 時に返される値は void とする

const pipeAsync = async (funcs: ((...args: any[]) => Promise<void>)[]) => {
    for(let i = 0; i < funcs.length; i++) {
        try {
            await funcs[i]()
        }catch(e){
            console.error('reject')
            return false
        }
    }
    return true
}

使い方。

// 非同期関数(resolveを返す)
const hoge = (message: string, delay: number) => () => {
    return new Promise<void>((resolve) => {
        setTimeout(() => {
            console.log(`resolve ${message}`)
            resolve()
        }, delay)
    })
}
// 非同期関数(rejectを返す)
const ngHoge = (message: string, delay: number) => () => {
    return new Promise<void>((resolve, reject) => {
        setTimeout(() => {
            console.log(`reject ${message}`)
            reject()
        }, delay)
    })
}

これは結果はtrueになる

(async () => {
   const result = await pipeAsync([hoge('hogehoge', 3000), hoge('foofoo', 1000)])
   console.log(result)
})()

これは結果はfalseになる。

(async () => {
   const result = await pipeAsync([hoge('hogehoge', 3000), ngHoge('nghoge', 2000), hoge('foofoo', 1000)])
   console.log(result)
})()