Skip to content

Instantly share code, notes, and snippets.

@SuperOleg39
Created January 22, 2020 18:43
Show Gist options
  • Select an option

  • Save SuperOleg39/99c300ccb253acdc35c0016790d380f9 to your computer and use it in GitHub Desktop.

Select an option

Save SuperOleg39/99c300ccb253acdc35c0016790d380f9 to your computer and use it in GitHub Desktop.
const assert = require('assert');
const www = {
'url1': 'result1',
'url2': 'result2',
'url3': 'result3',
'url4': 'result4'
};
const fetch = (url, ms = 1000) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(www[url]);
}, ms)
});
};
const createDeferred = () => {
let resolve;
let reject;
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
return {
promise,
resolve,
reject
};
};
/**
* @param {Array<string>} urls
* @param {number} concurrent
* @returns Promise<Array<any>>
*/
function makeRequests(urls, concurrent) {
const deferredRequests = urls.map(createDeferred);
const processedRequests = new Map();
let completed = 0;
let pending = 0;
let current = 0;
const run = () => {
while (pending < concurrent && completed < urls.length && current < urls.length) {
const deferred = deferredRequests[current];
const url = urls[current];
current++;
if (processedRequests.has(url)) {
processedRequests.get(url).promise.then((result) => {
deferred.resolve(result);
completed++;
run();
});
} else {
processedRequests.set(url, deferred);
pending++;
console.log(`fetch ${url} start`);
fetch(url).then((result) => {
console.log(`fetch ${url} end`);
deferred.resolve(result);
pending--;
completed++;
run();
});
}
}
}
run();
return Promise.all(deferredRequests.map((req) => req.promise));
}
const test = () => {
(() => {
makeRequests(
[
'url1',
'url2',
'url1',
'url3',
'url4',
'url2',
'url2',
'url2'
],
2
).then((results) => {
assert.deepEqual(
results,
[
'result1',
'result2',
'result1',
'result3',
'result4',
'result2',
'result2',
'result2'
]
);
});
})();
};
test();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment