回答里的“相当于”,我只是打个小比方,不是很精确~
var thunkify = require('thunkify');
var fs = require('fs');
var read = thunkify(fs.readFile);
read('package.json', 'utf8')(function(err, str){
});
按官网例子走一遍,首先 read 得到的是一个function,就是源码里thunkify的return;
然后read(xxxx)得到的其实是后面那个function也就是题主说的push的那个外层function。,最后执行fn(function(err, str){})
源码里args首先是拷贝了最开始read(xxx)的参数,到最后执行的时候args再push一个function【姑且叫pf】。
然后执行
try {
//fn即例子里的fs.readFile
fn.apply(ctx, args);
//这里相当于 fs.readFile('package.json', 'utf8', pf)
} catch (err) {
done(err);//done则是 function(err,str){}
}
显然,正常直接调用readFile应该是
fs.readFile('package.json','utf8',function(err,str){})
而这里巧妙的将最后一个异步回调改成pf,而pf的执行其实是调用了done.apply(null, arguments) //把pf的参数原封不动的传给done,而done在上面代码也说了,就是原来的回调。
所以题主问的push(function)也就是pf,其实就是原本要被thunkify的函数的最后一个function(即异步后的回调函数),那么其对应的参数,就是原函数的回调的参数了。
= = 说的我都有点绕了。希望题主看的懂。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…