I just started learning about generators and I'm trying to simulate a async/await request using generators and promises. My first attempt is the code below.
It is always console.log a pending Promise. I do not want to use async/await request because I'm trying to simulate it with generators
Thanks!
function* awaitReq() {
const val1 =
new Promise((resolve, reject) => {
setTimeout(() => resolve(5))
}).then((val) => val )
.catch((err) => "Error");
yield val1; // it returns the resolve() of my promise
// second call
yield val1 * 2;
}
const generator = awaitReq();
const { value, done } = generator.next();
// check if val is a number or error
if(isNaN(value)) {
console.log(value)
return value;
}
// otherwise, return the setTimeOut response times 2
console.log(generator.next().value)
Here is my solution:
function getNumber() {
return new Promise((resolve, reject) => {
resolve(10);
}).then((val) => {
return new Promise((resolve, reject) => {
resolve(val * 2)
//reject("Error");
}).then((val2) => val2);
}).catch((err) => {
return err;
})
}
// function taking a generator fucntion as argument
function run(generatorFn) {
const iterator = generatorFn(); // create iterator
const handleNext = (value) => {
const next = iterator.next(value);
if(next.done) {
return next.value;
} else {
return Promise.resolve(next.value)
.then((val) => handleNext(val))
.catch((err) => handleNext(err));
}
}
handleNext();
}
run(function* () {
try {
const result = yield getNumber();
console.log(result);
} catch (ex) {
console.log('Error: ' + ex);
}
})