gpt4 book ai didi

javascript - javascript本身是同步的,而环境是异步的吗?

转载 作者:行者123 更新时间:2023-12-02 23:43:06 25 4
gpt4 key购买 nike

原生 JavaScript 是单线程且同步的。只有少数对象可以异步运行并添加到回调队列中,例如 HTTP 请求、计时器和事件。这些异步对象是实际 javascript 环境的结果,而不是 javascript 本身。 setTimeout() 似乎是异步代码示例的首选。该函数被移动到 Web API 容器,然后最终移动到回调队列。似乎没有一种方法可以在 JavaScript 中编写异步代码而不涉及使用移动到 Web API 容器的对象。我可以使用回调编写自己的自定义对象,但最多只能将其构造为按正确的顺序运行。您永远无法编写不依赖于这些对象的并行运行的 JavaScript 代码。

这是我的理解,如有错误请指正。

最佳答案

setTimeoutsetInterval 只是触发示例中某些异步行为的便捷方法。它是所有实现中标准 javascript 库的一部分,而不仅仅是浏览器环境的一部分。

但是异步代码的所有其他来源都依赖于某些外部进程。当发出 HTTP 请求时,您的 javascript 线程会告诉浏览器发出请求(什么 header 、什么 url 等)。浏览器根据其自己编译的内部结构,格式化请求,发送请求,等待响应,最后将一个项目添加到 javascript 的事件循环中,以便下次事件循环运行时进行处理。文件系统访问和数据库查询是依赖于外部进程(分别是操作系统和数据库)的异步代码的另外两个常见示例

javascript 如何在单线程进程中处理异步代码都取决于这个 event loop 。伪代码中的事件循环基本上是这样的:

while (queue.waitForMessage()) {
queue.processNextMessage();
}

setTimeout 告诉环境在未来的某个时刻将某些内容弹出到该队列中。但该队列的处理是单线程的。同时只能处理一条事件消息,但可以将任意数量的事件消息添加到该队列中。

<小时/>

您可以通过 workers 获得真正的并发,但这基本上添加了一个新的 javascript 进程,该进程本身是单线程的,并且具有与主 javascript 进程之间进行消息通信的方法。

关于javascript - javascript本身是同步的,而环境是异步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55975592/

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