【问题标题】:setTimeout vs WebWorker vs XMLHttpRequestsetTimeout vs WebWorker vs XMLHttpRequest
【发布时间】:2020-04-30 00:22:45
【问题描述】:

我需要更清楚地理解这些概念,因为我不确定。 Javascript 是单线程的,到目前为止,一切都很好。

  1. 据我了解,setTimeout 只是延迟了主线程中代码的执行,但当调用堆栈为空时,它仍会在主线程上执行回调。它是否正确? Promises 和 Event Handlers 也是如此。

    setTimeout(() => {
    console.log('this line of code is executed on the main thread');
    }, 5000);
    
  2. 对于使用 XMLHttpRequest 的异步请求,实际请求被发送到由浏览器实现的单独 API,在单独的线程上运行它,因此它是真正的异步。这是正确的吗?

  3. WebWorkers 将是浏览器实现的另一个 API,它也在后台线程中运行来自给定脚本的代码。这是正确的吗?

如果能回答这个问题,我将不胜感激!

【问题讨论】:

  • 1、2 和 3:是
  • 我建议阅读 JS 中的事件循环。它回答了你上面提到的所有问题。
  • 基本上,javascript是单线程的,浏览器不是用javascript编写的。 (请注意,Promise 与 setTimeout 并不完全相同,它们需要一个父任务,而 setTimeout 将是它们自己的任务。

标签: javascript asynchronous xmlhttprequest settimeout web-worker


【解决方案1】:

您在所有三点上通常都是正确的。

  1. 当先决条件完成时,设置超时和任何其他异步函数将排队等待执行。因此,当调用堆栈为空并且有工作要做时,JS 会选择下一个排队的函数并执行它。这由所谓的 javascript 事件队列处理。
  2. 与 setTimeout 没有太大的实际区别。一旦完成,这两个函数都会将您的回调排队,负责该操作的代码是实现定义的,因此浏览器可以选择就多线程而言如何执行此操作。
  3. 是的,worker 在另一个线程中运行并且有它自己的事件循环。如果它将消息发送到主线程,则该消息的回调将排队等待该消息在主线程中运行,反之亦然。请注意,据我所知,Web 浏览器没有义务为每个工作人员提供一个线程,但这不会以任何方式影响您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多