Node.js函数与回调dos't运行异步

时间:2013-08-18 14:14:46

标签: node.js callback

我试图以异步方式运行一个函数,但我总是按照我调用它们的顺序重新调用结果,而不是接收最快的函数。

这是一个例子。预期的结果是打印前100,即使是最后一次打印。

function f1(callback){
    i = 0;
    for (i;i< 100;i++){

    }

    if (i == 100){
        return callback(i);
    }
}

function f2(callback){
    i = 0;
    for (i;i< 99999999999;i++){

    }

    if (i == 99999999999){
        return callback(i);
    }
}

f2(function(i){
    console.log(i);
})

f1(function(i){
    console.log(i);
});

1 个答案:

答案 0 :(得分:1)

在节点(以及一般的javascript)中,默认情况下,函数不是异步的。

在上面的代码中,你决不会对javascript的事件循环产生控制权。当你调用每个函数时,它会在for循环中运行直到完成,然后回调,这就是你按原样看到输出的原因。

当您开始执行IO或故意控制VM并使其有机会处理事件循环之外的其他事件时,节点的异步性质会启动。

要查看上面的代码以异步方式运行以进行测试:

function f1(callback){
    setTimeout(callback('f1'), 100);
}
function f2(callback){
    setTimeout(callback('f2'), 500);
}

f2(function(i){
    console.log(i);
})
f1(function(i){
    console.log(i);
});

setTimeout调用基本上只是说:尽可能接近所提供的函数(但不是之前)。这里基本上充当睡眠声明,并将控制权交还给当前正在执行的代码。