import * as _ from "lodash"; interface PrioritizedPromise { priority: number; promise: () => Promise; } export const runPriorityPromises = (promises: PrioritizedPromise[], onHigherResolve: (result: T) => void, onResolve?: (result: T) => void) => { let leaderPriority = -1; for (const { promise, priority } of promises) { new Promise(async resolve => { try { const result: T = await promise(); if (_.isFunction(onResolve)) { onResolve(result); } if (priority > leaderPriority) { leaderPriority = priority; onHigherResolve(result); } } catch {} }); } }