export function sleepPromise(ms: number): Promise { return new Promise((resolve) => { setTimeout(() => { resolve(true); }, ms); }); } /* Helper buddy for removing async/await try/catch litter */ export const safeAwait = (promise: Promise, finallyCallback?: any) => { return promise .then((data) => { return { result: data, error: undefined }; }) .catch((error: Error) => { return { result: undefined, error: error }; }) .finally(() => { if (finallyCallback && typeof finallyCallback === 'function') { finallyCallback(); } }); }; export const fetchDataArrayInBatches = async ( array: any[], returnResult: any, singleItemAsyncCallback: any ) => { if (!array || !singleItemAsyncCallback) return; if (!returnResult) { console.debug( 'fetchArrayInBatchesPromise: returnResult should not be undefined.' ); return; } const chunkSize = 20; const delayMs = 1000; console.log( `fetchArrayInBatchesPromise: Executing ${array.length} promises in batches with chunkSize ${chunkSize} per ${delayMs} ms.` ); let batchNum = 1; let count = 0; while (count < array.length) { const batch = array.slice(count, count + chunkSize); const tokenInfoBatch = await Promise.all( batch.map((token) => singleItemAsyncCallback(token)) ); returnResult = returnResult.concat(tokenInfoBatch); await sleepPromise(delayMs); console.log( `fetchArrayInBatchesPromise: The batch ${batchNum} have been all resolved.` ); batchNum++; count += chunkSize; } return returnResult; };