thunkify和co的邂逅

时间:2023-02-02 22:48:49

上一篇说到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的过程。