Skip to content

Instantly share code, notes, and snippets.

@unworthyEnzyme
Created March 11, 2023 14:56
Show Gist options
  • Save unworthyEnzyme/62ec78a0dac07c70f9ca10eed011ed8c to your computer and use it in GitHub Desktop.
Save unworthyEnzyme/62ec78a0dac07c70f9ca10eed011ed8c to your computer and use it in GitHub Desktop.
const EventEmitter = require("events");
function fetchUserName(id) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(`user${id}`), 1000);
});
}
function fetchUserAge(id) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (id > 10) {
resolve(Math.trunc(Math.random() * 100));
} else {
reject("Id should be greater than 10");
}
}, 1000);
});
}
function* main() {
try {
const name = yield fetchUserName(20);
console.log(name);
const age = yield fetchUserAge(20);
console.log(age);
} catch (e) {
console.log(e);
}
return 1;
}
//first solution
function awaiter(jobs, future_output) {
const { value, done } = jobs.next(future_output);
if (done) return;
value.then((future_output) => awaiter(jobs, future_output)).catch((e) =>
jobs.throw(e)
);
}
function run() {
const jobs = main();
awaiter(jobs, undefined);
}
// run();
//second solution
function promisfyGenerator(generator, ...args) {
const endEvent = new EventEmitter();
function awaiter(promises, future_output) {
const { value, done } = promises.next(future_output);
if (done) return endEvent.emit("end", value);
value.then((future_output) => awaiter(promises, future_output)).catch((e) =>
promises.throw(e)
);
}
const promises = generator(...args);
awaiter(promises, undefined);
return new Promise((resolve) => {
endEvent.on("end", (val) => resolve(val));
}).finally(() => endEvent.removeAllListeners("end"));
}
// promisfyGenerator(main).then((val) => console.log(val));
//third solution
function __awaiter(generator, ...args) {
const event = new EventEmitter();
const promises = generator(...args);
event.on("progress", (val) => {
const { value, done } = promises.next(val); //val Promise
if (done) {
event.emit("end", value);
} else {
value.then((value) => event.emit("progress", value)).catch((e) =>
promises.throw(e)
);
}
});
event.emit("progress", undefined);
return new Promise((resolve) => event.on("end", (val) => resolve(val)))
.finally(() => event.removeAllListeners());
}
__awaiter(main).then((val) => console.log(val));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment