![](/img/trans.png)
[英]How can I measure time taken by a synchronous http request in 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.