thunkify和co的邂逅

上一篇說到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

相關文章
相關標籤/搜索