thunkify重构
发布于 10个月前 作者 booxood 1296 次浏览

这个标题是不是太响亮了?!

刚看了[[[[[[[[[[[[[[[[[[[[[[[[@suqian](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian)](/user/suqian) 关于connect与koa的帖子,发现有用到一个require('thunkify-wrap');,于是好奇,找到了TJ的thunkify模块,thunkify-wrap没仔细去看,应该是对thunkify的功能进行了扩充吧。

对thunkify的那几十行代码看了估计都有一个小时吧,总算是明白了,IQ捉急啊。。。

觉得可以稍微改下,也许可以更好懂一点。

function thunkify(fn){
  return function(){
    var args = [].slice.call(arguments);
    var results;
    var cb;

    function callback(){
      if (results && cb) {
        cb.apply(this, results);
      }
    }

    args.push(function(){
      results = arguments;
      callback.apply(this);
    });

    fn.apply(this, args);

    return function(fn){
      cb = fn;
      callback.apply(this);
    }
  }
};

主要两点改动,一是把两次判断是否执行cb合并到了一起,二是去掉对called的判断。 对于第二点,TJ在已发的PR回复说 ”the called check is to prevent double callbacks“ 但不会有两次callback都成功的吧,只有一次callback会成功执行。

本准备直接发PR的,想想先让各位大大过目一下,看看这样是否合适。

10 回复

提取了个方法, 不错, 可以跑下test试试

其实不需要这种东西~~~ 只要 yield xxx.bind(null, yyyy), 即可,

比如 fs ,

yield fs.readFile.bind(null, yyyy)

嗯 有空看看有什么不同

yyyy 是什么?回调还是参数?

@xieren58 将函数用thunkify封装下是为了配合 co 用,你这样可以吗?

@booxood 可以,你自己可以试试

回到顶部