【问题标题】:JavaScript execution blocks and the message queueJavaScript 执行块和消息队列
【发布时间】:2017-09-07 02:43:02
【问题描述】:

是否有可能在循环执行块之后调用延迟为 0 毫秒 setTimeout(function, 0) 的超时函数,或者是否会先完成包含函数块总是

setTimeout(function(){ //something in here }, 0);

function myFunction() {
  // do something
  // loop block

  // could timeout = 0 be scheduled to execute here?

  // do more things
}

myFunction()

在我的上下文中(Angular 2),在我完成操作嵌套中的双向绑定属性之前,了解是否可以调用 Angular 的 ApplicationRef.tick() 来检查数据绑定/组件更改会很有趣循环?

函数调用和所有后续子函数调用是否等同于消息队列中的单个项目,还是分解为每个执行块作为消息队列中的单个项目?因此setTimeout(..., 0) 可能进入队列中的执行块之间?

【问题讨论】:

  • 如果你想了解更多关于 JS 调用栈以及为什么异步代码在同步代码运行完成后总是被调用,我鼓励你watch this great talk

标签: javascript angular settimeout nonblocking


【解决方案1】:

不,这是不可能的。您可以将 javaScript 视为“一个线程”——在任何时间点运行的代码只有一个和平。当前流程完成后将执行任何超时。 此外,在执行 javascript 页面时会变得无响应——您无法执行任何操作。

一些演示:

setTimeout(function() { console.log(1) }); 
var d = new Date();
var i = 0; for(; i < 1e9; i++) {}
console.log(i);
console.log('Passed ' + (new Date() - d));

>> 1000000000
>> Passed ~2000
>> 1

【讨论】:

  • 谢谢,知道这是“单线程”,但不确定 JS 引擎是否会分解执行块并将它们排队,在这种情况下,可以在最近的点插入超时。但我明白事实并非如此。再次感谢。
猜你喜欢
  • 2012-10-10
  • 1970-01-01
  • 2013-05-16
  • 2018-02-23
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 2011-02-21
  • 2018-09-18
相关资源
最近更新 更多