javascript - 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');
    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');

输出:

In main2

f1 start

f1 complete

f3 start

f3 complete

f2 start

f2 complete

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

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

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

[编辑] 注意:以上代码是在 Node.js 中运行的

最佳答案

我已经在 firebug 控制台中尝试了您的代码,我按以下顺序得到了输出,我认为这是预期的。

在主2 f1 开始 f1完成 f2 开始 f2 完成 f3 开始 f3 完成

我在 fedora 上使用 firefox 12.0。

关于javascript - setTimeout函数和异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18911330/

相关文章:

node.js - Node js 应用程序中数据库连接池处理的最佳实践?

javascript - ajax异步删除帖子 - php

javascript - 为什么在没有 new 关键字的情况下声明为函数的变量是未定义的?

javascript - Three.js + 传单 = 3D map ?

node.js - 添加到 JSON 的新数据不断替换以前的数据

javascript - 如何在客户端(浏览器)使用uWS?

javascript - 检索菜单项单击上的托盘位置

javascript - 如何在 jQuery 中设置文本框的值?

javascript - 如何将 put 请求与 axios 连接以使其在前端工作?

python - Golang 中的并发服务器