JSFiddle - React, Tailwind, and code Playground
by Michael Danilov
JavaScript
function* sleep(ms, val) {
return yield new Promise(r => setTimeout(() => r(val), ms))
}
function* test(fl, time = 1e3) {
yield 0
return fl ? yield* sleep(time, 'reg') : yield 2
}
function* each() {
let sum = 0
for(let i = 0; i < 1e6; i++)
sum += yield* test()
return yield sum
}
function* test2() {
Promise.resolve().then(() => console.log('after'))
console.log('sum:', yield* each())
Promise.resolve().then(() => console.log('before sleep'))
for(let i = 10; i--; )
console.log(`r${i}=`, yield* test(1, 100))
console.log('sum:', yield* each())
return yield* each()
}
asyncWrapper(test2()).then(console.log);
function asyncWrapper(gen) {
let iter = gen.next();
const fn = () => {
while(!iter.done) {
if (typeof iter.value.then === 'function') {
return iter.value.then(value => {
iter = gen.next(value);
return fn(iter);
});
}
iter = gen.next(iter.value);
}
return iter.value;
};
return new Promise(r => r(fn()));
}
// function asyncWrapper(gen) {
// return new Promise(async r => {
// let iter = gen.next();
// while(!iter.done) {
// if (typeof iter.value.then === 'function') {
// iter = gen.next(await iter.value);
// } else {
// iter = gen.next(iter.value);
// }
// }
// r(iter.value);
// });
// }