Co 伪实现

g.next().done === false * 1. --> console.log('start gen') * 2. --> yield requestAsync() && PAUSE!!! * 3. --> requestAsync 内部 Promise resolve 后 result => g.next(result) * 4. --> gen 内部继续执行 && (yield requestAsync()) => result && console.log(result) * 5. --> g.next(result).done === true */ g.next();

/* ---- co 伪实现 ---- */

/* * @param {function} gen * * 0. --> gen() => g * 1. --> g.next(res: undefined) --> (yield new Promise...) * 2. --> ret = g.next(res: undefined) => ret.value: Promise * 2. --> ret.value.then(onFulfilled) => onFulfilled(val) * 3. --> g.next(val) --> (yield new Promise...) => val * 4. --> const res = val ... * 5. --> yield ... */ function co(gen) { return new Promise((resolve, reject) => { const g = gen();

onFulfilled();

function onFulfilled(res) {
  let ret;
  try {
    ret = g.next(res);
  } catch (e) {
    return reject(e);
  }
  next(ret);
}

function next(ret) {
  if (ret.done) return resolve(ret.value);
  return ret.value.then(onFulfilled);
}

}); }

co(function*() { const res1 = yield new Promise(res => setTimeout(res, 2500, 10)); console.log(res1); const res2 = yield new Promise(res => setTimeout(res, 500, res1 + 10)); console.log(res2); const res3 = yield new Promise(res => setTimeout(res, 500, res2 + 10)); console.log(res3); }); ```

-->
loading...
loading...

最新评论

    还没有人评论...

Powered by Fun & Rainsho. Copyright © 2017. [Manage]

www.rainsho.cc. All rights reserved.