如何检查异步执行的函数队列?

时间:2014-07-23 01:25:49

标签: javascript asynchronous settimeout

我不知道我是否已经清楚地描述了这个标题。我最好告诉你代码:

这里有4个函数,我想用其中一些函数创建一个异步执行:

function a(){
    console.log('a');
}
function b(){
    console.log('b');
}
function c(){
    console.log('c');
}
function d(){
    console.log('d');
}

a();
setTimeout(b, 1);
setTimeout(c, 0);
d();

此日志:

  

'A'
  'd'
  'B'
  'c' 的

它会返回一个不同的结果来将我的代码更改为:

function a(){
    console.log('a');
}
function b(){
    console.log('b');
}
function c(){
    console.log('c');
}
function d(){
    console.log('d');
}

a();
setTimeout(b, 2); // delay seconds for b have been changed here
setTimeout(c, 0);
d();

此日志:

  

'A'
  'd'
  'C'
  'B'

我的执行环境是在Chrome版本36.0.1985.125 MacOSX中。

我的问题是:

当我将b的延迟秒设置为2时,它的执行结果完全不同。 setTimeout(b,1)和setTimeout(b,2)之间有什么区别?

有人可以帮忙吗?非常感谢。

2 个答案:

答案 0 :(得分:1)

大多数浏览器的调度时间分辨率最低。 HTML5将最小值设置为4毫秒。如果你要求4ms以下的任何东西,它将在4ms后执行一段时间。我有理由 - 但不是100% - 确定你看到了不可预测的行为 - 即你的两个例子应该在adcb一段时间内出现,而adbc在其他时间出现。

HTML5 Spec, Timers

  
      
  1. 如果嵌套级别大于5,并且超时小于4,则将超时增加到4。
  2.   

答案 1 :(得分:1)

setTimeout(b, 2);

上面的代码没有延迟2秒,它是2毫秒。 我不确定,也许这就是原因,因为javascript逐行执行代码。所以当你使用

setTimeout(b, 1);
setTimeout(c, 0);

它已经传递了1毫秒,所以它将直接执行函数b,因为解析下一行代码会花费时间。

我做了一个测试来证明它。

a();
t1 = setTimeout(b, 2); 

//javascript will parse and execute the following code ,and this costs some milliseconds.
for(i=0;i<100;i++){
   console.log('no.'+i);
}

t2 = setTimeout(c, 0);
d();

结果是:

d
b  
c