co函数

作者: xiamihaozi | 来源:发表于2019-03-14 14:05 被阅读0次

一、什么是 co 函数库?

co 函数库是著名程序员 TJ Holowaychuk 于2013年6月发布的一个小工具,用于 Generator 函数的自动执行。

二、 co 函数库的原理

将两种自动执行器(Thunk 函数和 Promise 对象),包装成一个库。
co 函数接受 Generator 函数作为参数,返回一个 Promise 对象。

function co(gen) {
  var ctx = this;

  return new Promise(function(resolve, reject) {
  });
}

在返回的 Promise 对象里面,co 先检查参数 gen 是否为 Generator 函数。如果是,就执行该函数,得到一个内部指针对象;如果不是就返回,并将 Promise 对象的状态改为 resolved 。

function co(gen) {
  var ctx = this;

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

接着,co 将 Generator 函数的内部指针对象的 next 方法,包装成 onFulefilled 函数。这主要是为了能够捕捉抛出的错误。

function co(gen) {
  var ctx = this;

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

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

最后,就是关键的 next 函数,它会反复调用自身。
第一行,检查当前是否为 Generator 函数的最后一步,如果是就返回。
第二行,确保每一步的返回值,是 Promise 对象。
第三行,使用 then 方法,为返回值加上回调函数,然后通过 onFulfilled 函数再次调用 next 函数。
第四行,在参数不符合要求的情况下(参数非 Thunk 函数和 Promise 对象),将 Promise 对象的状态改为 rejected,从而终止执行。

function next(ret) {
  if (ret.done) return resolve(ret.value);
  var value = toPromise.call(ctx, ret.value);
  if (value && isPromise(value)) return value.then(onFulfilled, onRejected);
  return onRejected(new TypeError('You may only yield a function, promise, generator, array, or object, '
        + 'but the following object was passed: "' + String(ret.value) + '"'));
    }
});

五、并发的异步操作
co 支持并发的异步操作,即允许某些操作同时进行,等到它们全部完成,才进行下一步。
这时,要把并发的操作都放在数组或对象里面。

相关文章

  • co函数

    一、什么是 co 函数库? co 函数库是著名程序员 TJ Holowaychuk 于2013年6月发布的一个小工...

  • async函数实现原理

    async函数原理是generator和promise,其中最重要的一个核心方法是co函数 co函数 原版是tj所...

  • Generator 函数的异步应用

    传统方法 基本概念 Generator 函数 Thunk 函数 co 模块

  • Excel(二)

    平方根函数SQRT 求和函数SUM 求平均值函数AVERAGE COUNT函数 COUNTA函数 条件计数函数CO...

  • co是干啥用的

    再说co之前要先搞清楚 Thunk函数和 Generator函数 Generator函数: 简单来说Generat...

  • 2019-04-16Event事件

    焦点 获取焦点事件 onfocus 函数focus(); 失去焦点事件 onblur 函数blur(); 块co...

  • CycliBarriar

    CyclicBarrier 构造函数源码 CyclicBarrier 与 CountDownLatch 区别 Co...

  • mysql 常用函数,存储过程,触发器等

    数学函数 round(m,n) 四舍五入 rand() 随机函数 字符串函数 lower(),upper(),co...

  • SQL培训

    DDLDMLDCL 聚合函数:(有关集合) 对多个集合进行处理聚集函数:max min sum avg co...

  • 构造函数的属性和方法

    构造函数: function Cat (name ,color){this.name = name;this.co...

网友评论

      本文标题:co函数

      本文链接:https://www.haomeiwen.com/subject/swvqmqtx.html