1

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

这是一个例子。预期的结果是打印前 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);
});
4

1 回答 1

1

在 node 中(以及一般的 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调用基本上只是说:尽可能接近 n 毫秒(但不是之前)回调提供的函数。基本上在这里充当睡眠语句并将控制权交还给当前正在执行的代码。

于 2013-08-18T14:53:48.857 回答