[英]calling a function within setTimeout
定义函数并调用“回调”
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);
}
}
这两种方法有什么区别?
当您“直接”调用callback()
,这发生在计时器关闭之前 ; 它发生在对setTimeout()
的调用发生之前。
像这样的表达
callback(null, number * 2)
是一个函数调用,因此,它总是在JavaScript需要其值时进行评估。 在函数调用中使用它时:
setTimeout(callback(null, number * 2), 100);
然后对其求值,以获取需要传递给setTimeout()
。 就像您使用简单的算术表达式调用某些函数一样:
someFunction(x + y);
你完全相信,什么传递给函数的总和 x
和y
。 函数调用只是另一种表达式,当将其用作函数的参数时,也会对其进行完全评估。
setTimeout
将函数引用作为第一个参数。 因此,当您调用函数时(如第二种情况),该函数调用应返回一个函数。 这不是你的情况。 您想传递函数引用-不要调用它。 您可以使用bind
来执行此操作, bind
确实会返回一个新函数,并且已经绑定了参数:
var evenDoubler = function(number, callback) {
if (number % 2 == 0) {
setTimeout(callback.bind(null, null, number * 2), 100);
}
}
问题已经回答,但是我想通过参加相同课程的测试该解决方案来说明一下。
如果您确实想以一种简洁的方式进行“脏”调用,则将第一个参数作为函数名,在超时时间段后其余参数作为参数提供,如下所示:
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 );
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.