(async) spawn函数-自动执行器

function spawn(genF) {
  return new Promise((resolve, reject) => {
    var gen = genF();

    function step(nextF) {
      try {
        var next = nextF();
      } catch (e) {
        return reject(e);
      }

      if (next.done) {
        return resolve(next.value);
      }

      Promise.resolve(next.value).then(
        (v) => {
          step(() => gen.next(v));
        },
        (e) => {
          step(() => gen.throw(e));
        }
      );
    }

    step(() => {
      gen.next(undefined);
    });
  });
}