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);
//   });
// }