我对同步 JavaScript 与异步 JavaScript 感到困惑。如果默认情况下 JavaScript 是单线程的,并且一次只能逐行完成一个操作,这不是“异步”的,即事情不会同时发生吗?它是如何同步的?
也是一段类似promise的异步代码,promise允许其余代码在等待解析时运行。这不是同步的,即让多个操作同时发生吗?
我很困惑,因为在我看来这似乎是错误的方式。
最佳答案
有些东西可以是单线程的也可以是异步的。
首先,我们来谈谈线程和进程的区别。
基本定义是独立的进程有独立的内存空间——它们不能访问彼此的内存。
而不同的线程共享相同的内存空间。
如果我们将一个线程看作一个指令队列,一个多线程应用程序可以有两个这样的指令队列同时运行,但每个都访问相同的内存(并且可能会搞砸内存的状态另一个线程。)。
JavaScript 是单线程的
这意味着只有一个指令队列。
现在,这是否意味着 JavaScript 可能不适合做 embarrassingly parallel处理就像使用快速排序算法对一万亿个数字进行排序一样,因为您无法使用计算机的多个处理器。
那么异步是如何工作的呢?
归结为 JavaScript event loop ,以及 JavaScript 是 non-blocking 的事实.
举个例子,如果我写一些代码如下:
const response = await fetch("/api/someData");
或者不使用异步/等待:
fetch("/api/someData").then(response => {
//Use the response here.
});
假设此响应返回需要一秒钟,JavaScript 引擎不会坐在那里等待响应返回。
相反,事件循环继续并继续处理它可以处理的所有其他内容,直到 promise 解决并且该代码可以继续。
如果您想详细了解事件循环的具体工作原理,我建议您阅读 Mozilla 文档,或 this post .
关于javascript - 如果 JavaScript 一次只能完成一个操作,那么它如何同步,同步意味着事情同时发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55738209/