上一篇說到thunkify的做用,這一篇說一下thunkify和co的集合api
co中有一塊代碼promise
/** * 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的函數koa
譬如var thunkFunc = thunkify(function(a,b,c,callback){})(a,b,c)這樣的函數
在若是是在koa中的話,能夠直接使用yield thunkFunc來執行該函數。this
co檢測到你的迭代器返回的是一個function,就會調用本身的thunkToPromise(thunkFunc)來執行,在該函數中,該方法被包裝成一個promse並執行,在執行的時候被放入了一個callback,該callback帶有兩個參數err和res,當執行完後調用promise的resolve方法返回callback中的res(co值想讓你的callback有兩個參數)。co+thunkify來完成函數的調用,省去了本身添加callback的過程。spa