javascript - 如果 JavaScript 一次只能完成一个操作,那么它如何同步,同步意味着事情同时发生

标签 javascript

我对同步 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/

相关文章:

javascript - jQuery scrollTop 到容器 div 的顶部

javascript - 我如何获取来自 Facebook 的通知?

javascript - 在 while 循环处于事件状态之前,不会显示 Canvas 函数结果

javascript - 应用程序在捆绑后未定义

javascript - 检测可打印键

javascript - 如何检查对象是否为 jQuery 事件

javascript - Amazon S3 签名 URL 无法与 Office Web Apps 查看器配合使用(encodeURIComponent 无法使用)

javascript - 如何相对于底层图像绝对定位形状元素?

javascript - 过渡/动画后CSS触发javascript

javascript - JS 模块模式和调用另一个函数