Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Promise.joinPooledTasks = (worker, poolSize) => {
- return new Promise((resolve, reject) => {
- var results = [];
- var numberOfRunningTasks = 0;
- var didEnqueAllTasks = false;
- var nextTaskIndex = 0;
- var enqueNextTaskIfPossible = () => {
- if (numberOfRunningTasks < poolSize) {
- var nextTask = worker(nextTaskIndex);
- if (nextTask === null) {
- didEnqueAllTasks = true;
- }
- else {
- results.push(0);
- enqueTask(nextTask, nextTaskIndex);
- nextTaskIndex += 1;
- if (numberOfRunningTasks < poolSize) {
- enqueNextTaskIfPossible();
- }
- }
- }
- };
- var resolveIfNeeded = () => {
- var shouldResolve = didEnqueAllTasks && numberOfRunningTasks === 0;
- if (shouldResolve) {
- resolve(results);
- }
- else if (!didEnqueAllTasks) {
- enqueNextTaskIfPossible();
- }
- return shouldResolve;
- };
- var enqueTask = (promise, index) => {
- var isPromise = typeof promise.then == 'function';
- if (isPromise) {
- numberOfRunningTasks += 1;
- promise.then(result => {
- results[index] = { result : result };
- numberOfRunningTasks -= 1;
- resolveIfNeeded();
- }, err => {
- results[index] = { error : err };
- numberOfRunningTasks -= 1;
- resolveIfNeeded();
- });
- }
- else {
- results[index] = { result : promise };
- resolveIfNeeded();
- }
- };
- enqueNextTaskIfPossible();
- });
- }
- //Testing code
- function getRandomInt(min, max) {
- min = Math.ceil(min);
- max = Math.floor(max);
- return Math.floor(Math.random() * (max - min)) + min;
- }
- var worker = index => {
- if (index > 20) return null;
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- if (Math.random() > 0.5) {
- console.log(`${index} >> success`);
- resolve(index)
- }
- else {
- console.log(`${index} >> failure`);
- reject(index);
- }
- }, getRandomInt(1000, 2250));
- });
- };
- Promise.joinPooledTasks(worker, 3).then(results => {
- console.log(`${results.length} promises ended`);
- for (var i=0; i < results.length; i++) {
- var result = results[i];
- if (result.result) {
- console.log(`${i} >> success: ${result.result}`);
- }
- else {
- console.log(`${i} >> failure: ${result.error}`);
- }
- }
- }, err => { console.log(err); } );
Add Comment
Please, Sign In to add comment