上一篇说到thunkify的作用,这一篇说一下thunkify和co的集合

co中有一块代码

/**
 * Convert a thunk to a promise.
 *
 * @param {Function}
 * @return {Promise}
 * @api private
 */

function thunkToPromise(fn) {
  var ctx = this;
  return new Promise(function (resolve, reject) {
    fn.call(ctx, function (err, res) {
      if (err) return reject(err);
      if (arguments.length > 2) res = slice.call(arguments, 1);
      resolve(res);
    });
  });
}

当你使用thunkify来处理一个带有callback的函数时候,co期待你处理后的函数上一个只接受一个callback的函数

譬如var thunkFunc = thunkify(function(a,b,c,callback){})(a,b,c)这样的

在如果是在koa中的话,可以直接使用yield thunkFunc来执行该函数。

co检测到你的迭代器返回的是一个function,就会调用自己的thunkToPromise(thunkFunc)来执行,在该函数中,该方法被包装成一个promse并执行,在执行的时候被放入了一个callback,该callback带有两个参数err和res,当执行完后调用promise的resolve方法返回callback中的res(co值想让你的callback有两个参数)。co+thunkify来完成函数的调用,省去了自己添加callback的过程。

 posted on 2016-05-05 16:29  友方人员  阅读(424)  评论(0编辑  收藏  举报