Skip to content

Instantly share code, notes, and snippets.

@greenlikeorange
Last active October 20, 2020 13:20
Show Gist options
  • Save greenlikeorange/0d6d9871fcbbea64c784e3aa2c0f2fc4 to your computer and use it in GitHub Desktop.
Save greenlikeorange/0d6d9871fcbbea64c784e3aa2c0f2fc4 to your computer and use it in GitHub Desktop.
Async function optimiser
const EventEmitter = require('events');
class Optimizer extends EventEmitter {
// state
#inprogress = {};
constructor(fn, maxConcurrentCall = 10) {
super();
this.setMaxListeners(maxConcurrentCall);
return (tag) => {
return async (...args) => {
return new Promise((resolve, reject) => {
this.once(tag, (err, result) => {
if (err) reject(err);
else resolve(result)
});
if (!this.#inprogress[tag]) {
this.#inprogress[tag] = true;
fn(...args)
.then((result) => {
this.emit(tag, null, result);
})
.catch((err) => {
this.emit(tag, err, null);
})
.finally(() => {
this.#inprogress[tag] = false;
});
}
});
}
}
}
}
async function getRandomInOneSecond() {
return new Promise((resolve) => {
setTimeout(function (){
resolve(Math.random());
}, 1000);
})
}
async function test() {
const getRandomInOneSecondFor = new Optimizer(getRandomInOneSecond);
Promise.all([
getRandomInOneSecondFor('LuckyDraw A')(),
getRandomInOneSecondFor('LuckyDraw B')(),
getRandomInOneSecondFor('LuckyDraw A')(),
getRandomInOneSecondFor('LuckyDraw A')(),
getRandomInOneSecondFor('LuckyDraw B')(),
]).then((results) => {
console.log(results);
});
}
test().catch(console.error);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment