UNPKG

run-in-batch

Version:

Run your task like api calls in batch

61 lines (49 loc) 1.35 kB
require("./polyfill"); const chunk = require("./chunk"); const { PARALLEL, SERIES, RACE, TIMEOUT } = require("./constants"); async function run(tasks, options = {}) { let results = []; const { batchSize } = options; const batches = chunk(tasks, batchSize); for (const batch of batches) { const result = await runBatch(batch, options); results = results.concat(result); await postRunBatch(batch, options, results); } return results; } async function runBatch(batch, options) { const { onTaskRun, onBatchRun, taskTimeout, taskTimeoutVal = TIMEOUT } = options; let { runType = PARALLEL } = options; if (onBatchRun) { const result = await onBatchRun(batch); return result; } if (!onTaskRun) return []; if (taskTimeout) runType = RACE; const tasks = batch.map((task) => onTaskRun(task)); switch (runType) { case PARALLEL: return await Promise.all(tasks); case SERIES: return await Promise.series(tasks); case RACE: return await Promise.raceAll( tasks, taskTimeout, taskTimeoutVal, options.runType ); } } async function postRunBatch(batch, options, results) { const { onBatchComplete } = options; if (!onBatchComplete) return; return await onBatchComplete(batch, options, results); } module.exports = run;