我试图以异步方式运行一个函数,但我总是按照我调用它们的顺序重新调用结果,而不是接收最快的函数。
这是一个例子。预期的结果是打印前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);
});
答案 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
调用基本上只是说:尽可能接近所提供的函数(但不是之前)。这里基本上充当睡眠声明,并将控制权交还给当前正在执行的代码。