如何在JavaScript中生成执行队列?

时间:2015-12-08 13:45:52

标签: javascript asynchronous settimeout

考虑这个简单的例子:

console.log('Start');

setTimeout(function() {
  console.log('First timeout');
}, 100);

setTimeout(function () {
  console.log('Second timeout');
}, 2000);

var time = Date.now();
for (var i = 0; i < 2000000000; i++) {
  var temp = i * i * Math.sqrt(i);
  temp = temp + temp;
}
console.log(Date.now() - time);

setTimeout(function () {
  console.log('Third timeout');
}, 50);

console.log('End');

输出结果为:

Start
1219
End
First timeout
Third timeout
Second timeout

是什么让我想到生成执行队列(堆栈?)的方式。我是对的,JavaScript解释器首先检查代码,生成队列,然后开始执行,在超时时间过去时将函数从超时添加到队列末尾(因此我们有预生成的执行队列,在执行期间更新并动态生成超时列表)?

1 个答案:

答案 0 :(得分:2)

JavaScript是单线程的。 超时调用被推送到事件循环,因此它们在所有主流调用之后执行。

Sub test()

Application.DisplayAlerts = False

ThisWorkbook.Sheets(strSourceSheet).Copy
ActiveWorkbook.SaveAs Filename:=strFullname, FileFormat:=xlCSV, CreateBackup:=True
ActiveWorkbook.Close

Application.DisplayAlerts = True

End Sub

注意:“第三次超时”被推送到事件循环#2而不是#1,即使它有50ms vs 100ms(第一次),因为它是在你冗长的循环之后处理的,这花费了足够的时间用于第一次超时达到。

EventLoop解释说:https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop