在setTimeout中调用一个函数

时间:2017-02-08 17:01:07

标签: javascript node.js event-loop

定义一个函数并调用"回调"

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);
    }
}

这两种方法之间有什么区别?

3 个答案:

答案 0 :(得分:3)

当你"直接"拨打callback()计时器关闭之前发生;它发生在调用setTimeout()之前。

这样的表达式
callback(null, number * 2)

是一个函数调用,因此当JavaScript需要它的值时,它总是被评估。当它在函数调用中使用时:

setTimeout(callback(null, number * 2), 100);

然后对其进行评估,以获得需要传递给setTimeout()的值。它与使用简单算术表达式调用某个函数的方式相同:

someFunction(x + y);

您完全希望传递给该函数的内容是xy总和。函数调用只是另一种表达式,当它被用作函数的参数时,它也将被完全评估。

答案 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 );
    }
};