实现一个简单的co函数

2020-03-04  本文已影响0人  葶寳寳

coGenerator函数的自动执行器。它会返回一个Promise值。

co为什么能自动执行Generator函数?
其实就是递归的去调用Genertor函数返回值的next方法,让函数内部指针下移。

function run(gen){
  let context = this;

  return new Promise((resolve, reject) => {
    if (typeof gen === 'function') gen = gen.call(context);
    if (!gen || typeof gen.next !== 'function') return resolve(gen);

    onFulFilled();
    function onFulFilled(res) {
      var ret;
      try {
        ret = gen.next(res);
      } catch(err) {
        return reject(err);
      }
      next(ret);
    }

    function next(data) {
      if(data.done) resolve(data.value);

      let value = toPromise.call(context, data.value);
      if(value && isPromise(value)) {
        return value.then(onFulFilled, onRejected);
      }

      return function onRejected() {
        reject(new TypeError('Error ', data.value));
      }
    }
  })
}
上一篇 下一篇

猜你喜欢

热点阅读