我遇到了这个回调函数callbackPrinter
,以及它在我正在研究的Node.js项目中的用法。不确定它在做什么,特别是参考cb.apply(cb, arguments)
。
我很难缠绕整个callbackPrinter
正在做的事情。可以简化吗?除了记录消息之外,它还在做什么?
用法:
function someFunction(callback) {
...
async.parallel([
// Some stuff
], callbackPrinter(message, callback))
...
}
功能:
function callbackPrinter (message, cb) {
return function (err) {
if (err) { return cb.apply(cb, arguments) }
// Some code to log message
cb.apply(cb, arguments)
}
}
arguments
是一个阵列,cb
是this
apply()
方法调用具有给定this
值的函数,并将arguments
作为数组(或类数组对象)提供。
re:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
所以它在那里两次,第一个有条件地返回回调,第二个做东西然后回调得到apply
,在那里调用它。
注意arguments
对象是一个类似于Array的对象,对应于传递给函数的参数。从这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments SO因为.apply()
接受那个有效的阵列对象。
callbackPrinter
函数接受error-first callback function并返回一个包装原始函数的新函数,如果在没有message
的情况下调用回调,则另外记录给定的err
。
可以简化吗?可能如果您使用的Node.js版本足够新。 (如果你的代码库中的回调并不奇怪地使用this
作为当前正在执行的函数的引用 - 传递cb
作为Function.apply()
的第一个参数是奇数,通常你会传递undefined
。)这里是一个快速的刺:
function callbackPrinter (message, cb) {
return (err, ...args) => {
if (!err) {
// log message…
}
return cb(err, ...args)
}
}
.apply
,你不确定运行时中的结构/计数的确切参数。在你的情况下,你不确定天气会有err
。async.parallel
被调用时,callbackPrinter
运行并返回函数(function (err) {..}
),返回的函数将与finish/resolve trigger
的async.parallel
绑定。
当[ // Some stuff ]
中的所有作品(async.parallel
)都被运行(finished/resolved/rejected
)时,将调用返回的函数。const message = require('message');
const async = require('async');
function someFunction(callback) {
...
async.parallel([
// Some stuff
], function(err){
if (err) { return cb.apply(cb, arguments) }
// Some code to log message
cb.apply(cb, arguments)
})
...
}