Javascript setTimeout函数和异步函数

Javascript setTimeout函数和异步函数,javascript,node.js,asynchronous,scheduled-tasks,settimeout,Javascript,Node.js,Asynchronous,Scheduled Tasks,Settimeout,这与setTimeout如何执行回调有关 我有以下几点 function f1 (argument) { console.log('f1 start'); for(var i = 0; i < 100000; ++i) for(var j = 0; j < 10000; ++j); console.log('f1 complete'); } function f2 (argument) { console.log('f2 start'

这与
setTimeout
如何执行回调有关

我有以下几点

function f1 (argument) {
    console.log('f1 start');
    for(var i = 0; i < 100000; ++i)
        for(var j = 0; j < 10000; ++j);
    console.log('f1 complete');
}

function f2 (argument) {
    console.log('f2 start');
    for(var i = 0; i < 1000; ++i)
        for(var j = 0; j < 10000; ++j);
    console.log('f2 complete');
}

function f3 (argument) {
    console.log('f3 start');
    for(var i = 0; i < 10000; ++i)
        for(var j = 0; j < 10000; ++j);
    console.log('f3 complete');
}

setTimeout(f1,0);
setTimeout(f2,0);
setTimeout(f3,0);
console.log('In main2');
函数f1(参数){
console.log('f1 start');
对于(变量i=0;i<100000;++i)
对于(var j=0;j<10000;++j);
console.log('f1 complete');
}
函数f2(参数){
console.log('f2 start');
对于(变量i=0;i<1000;++i)
对于(var j=0;j<10000;++j);
console.log('f2 complete');
}
函数f3(参数){
console.log('f3 start');
对于(变量i=0;i<10000;++i)
对于(var j=0;j<10000;++j);
console.log(“f3完成”);
}
setTimeout(f1,0);
设置超时(f2,0);
设置超时(f3,0);
console.log('main2');
输出:

在缅因州2

f1起点

f1完成

f3启动

f3完成

f2开始

f2完成

John Resig在他的setTimeout中解释了将所有回调排队,直到当前代码块完成执行。此StackOverflow解释了即使事件看起来是立即触发的,但实际上它们是排队的

在上面的代码中,您会注意到,
f1()
最长,其次是f
3()
,然后是
f2()

我的问题是,为什么观察到的顺序(
f1
,然后是
f3
,最后是
f2
)?如果事件已排队,则其顺序应与调用的顺序相同(
f1
f2
f3
)。JavaScript引擎如何以及为什么首先选择最长的作业

[编辑]
注意:上面的代码是在Node.js中运行的,我已经在firebug控制台中尝试了您的代码,并按照以下顺序得到了输出,我认为这是预期的

在缅因州2 f1起点 f1完成 f2开始 f2完成 f3启动 f3完成

我将firefox 12.0与fedora一起使用。

无论“javascript引擎”问题如何(没有这样的东西,有不同的实现),因为这取决于(见此),如果您想确保特定的序列顺序,您可能需要使用承诺

请在以下位置查看Q库:

还是这个RSVP库

承诺/a+规范是

可用于节点和浏览器

我自己在节点v0.10.21上的测试(与firefox和chromium的控制台相同):


检查一下:我在node中也得到了顺序输出
f1 f2,然后是f3
我不知道如何才能得到该输出。必须始终按顺序调用函数(即
f1
,然后
f2
,然后
f3
)。JavaScript无法在不分析的情况下找出最长的函数。异步函数总是排队的。谢谢你提出这个问题——这让我想知道John Resig文章的来源。仅供参考,网站上有一个维基页面。所以,说有这样一件事不是完全错误的,对吗?:)在那篇维基文章中有一个“实现”部分说了我所说的,但是是的,说出来并不是完全错误的:)
~/workspace/tmp$ node test.js 
In main2
f1 start
f1 complete
f2 start
f2 complete
f3 start
f3 complete