gpt4 book ai didi

javascript - Web Api 是多线程的吗?

转载 作者:行者123 更新时间:2023-11-30 09:11:07 25 4
gpt4 key购买 nike

我正在观看有关 Async Javascript 的视频。 JS 是单线程但非阻塞

例如

console.log('A');
setTimeout(()=>{
console.log("B")
},1500);

setTimeout(()=>{
console.log("C")
},1000);

console.log('D');

在上面的代码中,AD 将首先打印,然后是 C,然后是 B

console.log("B") 和 console.log("C") 转到 Web API。1s 后,console.log("C") 返回到回调队列,console.log("B") 在 1.5s

后返回

虽然 console.log("B") 首先进入 Web Api,但它稍后会发送到回调队列。

这意味着 Web Api 也是异步的。

谁能告诉我 Web Api 是如何工作的?

最佳答案

没有一个“web API”。在 Web 浏览器中实现了数十个单独的 API。

setTimeout 使用浏览器的计时器实现安排计时器回调。 setTimeout 本身同步运行以安排回调,然后稍后浏览器调用回调函数。

JavaScript 使用事件循环作业队列(作业通常也称为任务)服务。所有 JavaScript 代码都在由事件循环运行的作业中运行。使用您问题中的代码,浏览器会自动排队以响应运行脚本中顶级代码的 script 标记。该代码的作用是:

  • console.log - 日志 A
  • setTimeout - 安排 1500 毫秒后回调
  • setTimeout - 安排 1000 毫秒后回调
  • console.log - 日志 D

大约 1000 毫秒后,浏览器的计时器机制将一个作业添加到队列中以运行由第二个 setTimeout 调用注册的回调。事件循环运行该作业并输出 C

大约 500 毫秒之后,浏览器的计时器机制将一个作业添加到队列中以运行由第一个 setTimeout 调用注册的回调。事件循环运行该作业并输出 B

浏览器、Node.js 和几乎所有其他环境中的 JavaScript 只允许每个领域(松散地,窗口/选项卡)有一个线程。有时,一个线程会跨领域共享(例如,当多个窗口/选项卡可以访问彼此的代码时)。主机(在本例中为浏览器)可能有其他线程用于执行操作(服务计时器、处理 ajax 等)。那些其他线程可以将作业添加到队列中,这些作业将由运行在 JavaScript 线程上的事件循环拾取。

更多关于计时器如何工作的信息 the "HTML" specification §8.5 (“HTML”规范远不止 HTML :-))。

关于javascript - Web Api 是多线程的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58910448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com