TypeScriptでのPromise直列実行 const createTask = ( result : string , delay : number ) => () =>
new Promise < string > ( ( resolve ) => setTimeout ( () => resolve (result) , delay)) ;
const createTasks = () => [
createTask ( " very long task " , 400 ) ,
createTask ( " long task " , 300 ) ,
createTask ( " short task " , 200 ) ,
createTask ( " very short task " , 100 ) ,
] ;
const handler = async (
label : string ,
handler : ( ps : ( () => Promise < string > )[] ) => Promise < string [] >,
) => {
console . time ( label ) ;
await handler ( createTasks ()) . then ( ( res ) => console . log ( " res " , res )) ;
console . timeEnd ( label ) ;
};
const test = async () => {
await handler ( " parallel " , ( tasks ) =>
Promise . all ( tasks . map ( ( task ) => task ())) ,
) ;
await handler ( " series " , ( tasks ) => series ( tasks )) ;
};
const series = < T extends unknown >( promises : ( () => Promise < T > )[] ) =>
promises . reduce (
async ( prev , current ) =>
prev . then ( async ( res ) => [ ... res , await current ()]) ,
Promise . resolve < T [] > ([]) ,
) ;
test () ;
res [ 'very long task', 'long task', 'short task', 'very short task' ]
parallel: 407.913ms
res [ 'very long task', 'long task', 'short task', 'very short task' ]
serial: 1.003s