【问题标题】:How does a single thread handle asynchronous code in JavaScript [duplicate]单线程如何处理 JavaScript 中的异步代码 [重复]
【发布时间】:2016-05-16 10:22:36
【问题描述】:

我知道 javascript 在单线程上运行。我也知道,当我们使用 jquery 进行异步 ajax 调用时,代码不会停止并继续串行执行。响应由回调处理。我的问题是单线程如何做到这一点? 当我们得到响应时,线程是否处理回调并停止进一步的代码执行

【问题讨论】:

  • here 有一个很好的答案,包括很多参考资料。

标签: javascript asynchronous


【解决方案1】:

不,它不会停止代码执行。

回调被排队,当没有其他要执行的时候,它就会运行。

没有两件事同时发生,调度也不是抢先的。

因此,如果您让单线程忙于诸如无限循环之类的事情,回调将永远没有机会运行。

【讨论】:

  • “无事可做”到底是什么意思?什么时候它有机会运行?你能举个例子解释一下吗? :))
  • 有一个事件循环(单线程)运行所有需要运行的脚本。所有回调都排队,并将一个接一个地运行。如果将无限循环放入其中一个函数中,则该函数将永远不会完成,并且控制不会返回到事件循环。结果,队列不再得到处理,系统挂起。
【解决方案2】:

浏览器管理一个事件队列。当事件发生时,例如来自 Ajax 调用的响应、计时器触发或鼠标或触摸事件,当主线程处于空闲状态时,就会在主线程上调用相应的回调。

【讨论】:

    【解决方案3】:

    这并不完全是如何工作的,因为它取决于您使用的是 Node 还是浏览器以及哪个浏览器,但它是一个很好的心理模型。

    JavaScript 位于另一种多线程语言(如 C)之上。当 JavaScript 运行 ajaxs 请求时,它会将请求添加到队列中,并且为处理网络请求而构建的语言会执行此操作。请求完成后,它会更改队列中的值。 在每个流程循环之后,JavaScript 将检查此队列并运行与已完成任务相关的任何回调。因此 JavaScript 本身并不执行该过程,而只是检查它们何时完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-12
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 2018-10-03
      • 2016-11-10
      • 2021-02-26
      相关资源
      最近更新 更多