1

我不明白为什么这段代码会阻塞。我使用 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");
4

2 回答 2

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 评论。)

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

于 2012-11-01T00:40:12.910 回答
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");    
于 2012-11-01T00:41:42.097 回答