async function* asyncBatchGenerator( tasks: (() => Promise)[], batchSize: number ): AsyncGenerator[]> { for (let i = 0; i < tasks.length; i += batchSize) { const batchTasks = tasks.slice(i, i + batchSize); const batchPromises = batchTasks.map((task) => task()); yield Promise.allSettled(batchPromises); } } // Usage const batchProcessStuff = () => { const batchSize = 2; const tasks = [ () => someAsyncTask(), () => someAsyncTask(), () => someAsyncTask() ] const responses: PromiseSettledResult[][] = []; for await (const batch of asyncBatchGenerator(tasks, batchSize)) { responses.push(batch); } return responses.flat(); }