定义一个函数并调用"回调"
var evenDoubler = function(number, callback) {
if (number % 2 == 0) {
setTimeout(function() {
callback(null, number * 2)
}, 100);
}
}
直接呼叫"回调"
var evenDoubler = function(number, callback) {
if (number % 2 == 0) {
setTimeout(callback(null, number * 2), 100);
}
}
这两种方法之间有什么区别?
答案 0 :(得分:3)
当你"直接"拨打callback()
,在计时器关闭之前发生;它发生在调用setTimeout()
之前。
像
这样的表达式callback(null, number * 2)
是一个函数调用,因此当JavaScript需要它的值时,它总是被评估。当它在函数调用中使用时:
setTimeout(callback(null, number * 2), 100);
然后对其进行评估,以获得需要传递给setTimeout()
的值。它与使用简单算术表达式调用某个函数的方式相同:
someFunction(x + y);
您完全希望传递给该函数的内容是x
和y
的总和。函数调用只是另一种表达式,当它被用作函数的参数时,它也将被完全评估。
答案 1 :(得分:2)
setTimeout
将第一个参数作为函数引用。因此,当您调用函数时(如第二种情况),该函数调用应该返回一个函数。这不是你的情况。您想传递函数参考 - 所以不要调用它。您可以使用bind
来执行此操作,它会返回一个新函数,其参数已绑定到它:
var evenDoubler = function(number, callback) {
if (number % 2 == 0) {
setTimeout(callback.bind(null, null, number * 2), 100);
}
}
答案 2 :(得分:0)
问题已经得到解答,但我想在我通过同一课程时测试这个解决方案时加入。
如果你真的想做"脏"以一种简洁的方式调用然后将第一个参数作为函数名称,在超时期限之后给出其余参数,如下所述:
https://nodejs.org/en/docs/guides/timers-in-node/
按照上面的解释,我用下面的代码测试了代码并且工作了:
var eventDoubler = function (num, callback) {
var waitTime = Math.floor(Math.random()*(maxTime+1));
if( num % 2 ) {
setTimeout(callback, waitTime, new Error('Odd Input'));
} else {
setTimeout(callback, waitTime, null, num*2 , waitTime );
}
};