簡體   English   中英

如果 JavaScript 一次只能完成一個操作並且同步意味着事情同時發生,那么它如何同步

[英]How is JavaScript synchronous if it can only complete one operation at a time and synchronous means things happen at the same time

我對同步 JavaScript 與異步感到困惑。 如果默認情況下 JavaScript 是單線程的並且一次只能一行一行地完成一個操作,這不是“異步”的,即事情不會同時發生嗎? 它是如何同步的?

也是一段像promise這樣的異步代碼,promise允許其余代碼在等待解析時運行。 這不是同步的,即讓多個操作同時發生嗎?

我很困惑,因為這在我看來似乎是錯誤的。

有些東西既可以是單線程的,也可以是異步的。

首先,讓我們談談線程進程之間的區別。

基本定義是單獨的進程具有單獨的內存空間——它們不能訪問彼此的內存。

而不同的線程共享相同的內存空間。

如果我們將線程視為指令隊列,那么多線程應用程序可以有兩個這樣的指令隊列同時運行,但每個隊列都訪問相同的內存(並且可能會破壞另一個線程的內存狀態) .)

JavaScript 是單線程的

所有這一切都意味着有一個指令隊列。

現在,這是否意味着 JavaScript 可能不適合進行令人尷尬的並行處理,例如使用快速排序算法對一萬億個數字進行排序,因為您無法利用計算機的多個處理器。

那么異步是如何工作的呢?

它歸結為JavaScript 事件循環,以及 JavaScript 是非阻塞的

舉個例子,如果我寫了一些看起來像這樣的代碼:

const response = await fetch("/api/someData"); 

或不使用異步/等待:

    fetch("/api/someData").then(response => {
        //Use the response here. 
    }); 

假設這個響應返回需要一秒鍾,JavaScript 引擎不會只是坐在那里什么都不做,直到響應返回。

相反,事件循環繼續並繼續處理它可以處理的所有其他內容,直到承諾解決並且該代碼可以繼續。

如果您想詳細了解事件循環的工作原理,我建議您閱讀 Mozilla 文檔或這篇文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM