具有相同间隔的多个setTimeout()函数的执行顺序

Uoo*_*ooo 28 javascript

请考虑以下Javascript代码:

function(){
    setTimeout(function() {
        $("#output").append(" one ");
    }, 1000);
    setTimeout(function() {
        $("#output").append(" two ");
    }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

你也可以在jsfiddle上看到这个例子.

我可以确定该值#output始终按此"one two"顺序排列吗?通常,我会像这样处理这个问题:

function(){
    setTimeout(function() {
        $("#output").append(" one ");
        $("#output").append(" two ");
    }, 1000));
}
Run Code Online (Sandbox Code Playgroud)

但我不能那样做,因为我从服务器获取消息,告诉我要执行哪个函数(在这个例子中追加"one"或追加"two"),我必须以一个小延迟执行.

我已经在Internet Explorer 9,Firefox 14,Chrome 20和Opera 12中测试了这个代码,输出总是如此"one two",但我能确定这种情况总是如此吗?

kyb*_*kos 13

规格就在这里.

我的解释setTimeout第8步在7.3节是执行顺序应该得到保证.

但是,我调查了这个问题,因为当窗口最小化然后在Chrome中最大化时,我发现来自外部源(如websockets或webworkers)的事件中设置的超时正在以错误的顺序执行.我认为这是一个浏览器错误,希望很快得到解决.

  • 是的,现在已经过了很多时间,并且规范文档已经改变.问题不在于定时器按计划准时发射,更多的是它们是否按预期顺序发射,即使有延迟. (2认同)