Javascript - 为什么这个代码会阻塞?

时间:2012-11-01 00:37:09

标签: javascript node.js

我不明白为什么这段代码会阻塞。我使用nodejs异步函数,但现在我想弄清楚非阻塞编程的本质是什么,以及如何实现它们。 这是我认为的方式,但它仍然阻挡。

   var async_func = function(x, func) {
        func(x+5);
    };

    setTimeout( async_func(5, function(number) {
        for (var x = 0; x < 1000000000; x++) {;}
        console.log(number);
    }), 3000);

    console.log("done");

2 个答案:

答案 0 :(得分:2)

尝试:

var async_func = function(x, func) {
    func(x+5);
};

setTimeout(function(){
    async_func(5, function(number) {
       console.log(number);
    });
}, 3000);

console.log("done");

(我还删除了不必要的for (var x = 0; x < 1000000000; x++) {;}

你不应该在没有匿名或帮助函数的情况下调用setTimeout中带有参数的函数...(如果你真的想这样做而不设置另一个函数,请检查@Ian comments below。) < / p>

如果你的函数没有任何参数你可以setTimeout(async_func, 3000);,但在这种情况下,最好的办法就是通过一个匿名函数来调用它(或者在上面用这些参数调用你的函数来声明一个调用函数)。

答案 1 :(得分:2)

使用setTimeout()时以及在要使用参数调用函数的函数引用时,这是一个常见的错误。这行代码:

setTimeout( async_func(5, function(number) {

立即执行async_func()然后将它的返回结果(不是函数)传递给setTimeout(),这不是你想要的。您希望将函数引用传递给setTimeout(),以便setTimeout()可以稍后调用该函数:

var async_func = function(x, func) {
    func(x+5);
};

setTimeout( function() {
    async_func(5, function(number) {
        for (var x = 0; x < 1000000000; x++) {;}
        console.log(number);
    });
}, 3000);

console.log("done");    

或者,有时通过使用定时器回调函数更容易理解它是自己的单独函数而没有参数。

function async_func(x, func) {
    func(x+5);
}

function timer_func() {
    async_func(5, function(number) {
        for (var x = 0; x < 1000000000; x++) {;}
        console.log(number);
    });
}

setTimeout(timer_func, 3000);

console.log("done");