首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的同步代码要异步执行?

为什么我的同步代码要异步执行?
EN

Stack Overflow用户
提问于 2021-11-30 17:43:52
回答 1查看 59关注 0票数 0

我正在尝试运行一些同步函数,它应该等待一定的时间,然后返回控制。但出于某种原因,它一直在异步执行,或者至少看起来是这样的。

这是代码:

代码语言:javascript
复制
function pause(ms) {
  var dt = new Date();
  while (new Date() - dt <= ms) {
    /* Do nothing */
  }
}

console.log("start calculation..");
pause(3000);
console.log("calculation finished!");

这将立即在控制台中显示以下内容:

代码语言:javascript
复制
start calculation..
calculation finished!

没有任何延迟,就像暂停函数是异步执行的。

我尝试了3种不同版本的暂停函数,没有任何区别。

您可以在我输入的沙盒中看到这一点。

(您必须使用preferences - sandbox.config.json并转到“无限回路保护”才能工作)

  1. 为什么代码不同步运行,首先显示“开始计算.”消息,然后是3秒延迟后的第二条消息?
  2. 是否有更好的方法来模拟运行时间昂贵的同步函数?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-20 15:04:47

由于我的质询只获部分答覆,我会自行提出解决办法,以防其他人有类似的问题:

首先,这段代码现在在Chrome、Chromium和Firefox的控制台中正常工作。它以前没有,因此在这方面可能对javascript引擎进行了升级。但是,当在提供的CodeSandbox中运行代码时,在延迟3秒之后,它仍然同时记录这两行代码。

正如人们所指出的,有两件事可能是造成这种情况的原因:

  • 编译器删除空循环
  • 只要循环运行,控制台消息就不会刷新。

此代码将解决以下两个问题:

代码语言:javascript
复制
function pause(ms, start=new Date()) {
  while (new Date() - start <= ms) {
    setTimeout(()=>pause(ms,start))
  }
}

console.log("start calculation..");
pause(3000);
console.log("calculation finished!");

调用SetTimeout (即使延迟为0 ms )将导致代码执行的其余部分(递归函数调用)被抛回事件循环中,以便在允许先执行事件回调之后进行后续处理。这可以确保其他事件--例如控制台的日志记录--不会被阻止。

它还将一些实际的代码放在循环中,这样循环就不会被任何编译器代码优化所删除。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70173835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档