generator coroutine

by Artem

JavaScript

'use strict';

function asyncOne() {
  return Promise.resolve(1);
}

function asyncTwo() {
  return Promise.resolve(2);
}

function asyncThree() {
  return Promise.resolve(3);
}

function* createFoo() {
  const one = yield asyncOne();
  const two = yield asyncTwo();
  const three = yield asyncThree();
  return three;
}

function coroutine(generator) {
  const gen = generator();

  function handle(res) {
    if (res.done) return Promise.resolve(res.value);
    return Promise.resolve(res.value)
      .then(result => handle(gen.next(result)));
  }

  return handle(gen.next());
}

/*const foo = createFoo();
foo.next().value
	.then(res => foo.next(res).value)
  .then(res => foo.next(res).value)
  .then(console.log);
*/


coroutine(createFoo).then(console.log)