setTimeout vs WebWorker vs XMLHttpRequest



我需要更清楚地理解这些概念,因为我不确定它们。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. 设置超时,当先决条件完成时,将排队执行任何其他异步函数。因此,当调用堆栈为空并且有工作要做时,JS会选择下一个排队的函数并执行它。这是由所谓的javascript事件队列处理的
  2. 与setTimeout没有太大的实际区别。一旦回调完成,这两个函数都会对回调进行排队,负责回调的代码是由实现定义的,所以浏览器可以选择多线程的方式
  3. 是的,worker在另一个线程中运行,并有自己的事件循环。如果它向主线程发送消息,则该消息的回调将排队,以便在带有该消息的主线程中运行,反之亦然。请注意,据我所知,web浏览器没有义务为每个工作人员提供一个线程,但这不应该以任何方式影响您

最新更新