亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Javascript async 和 await 等同于多線程嗎?

Javascript async 和 await 等同于多線程嗎?

肥皂起泡泡 2022-12-09 17:10:59
是在用async粗人await的線嗎?許多個月前,我學會了如何在 Android 上編寫多線程 Java 代碼。我記得我必須創建線程、啟動線程等?,F在我正在學習 Javascript,我剛剛了解了async和await。例如:async function isThisLikeTwoThreads() { const a = slowFunction(); const b = fastFunction(); console.log(await a, await b);}這看起來比我以前做的要簡單得多,而且直觀得多。slowFunction()將首先啟動,然后fastFunction()將啟動,并console.log()會等到兩個功能在記錄之前解決 - 并且slowFunction()可能fastFunction()同時運行。我希望它最終在瀏覽器上是否是單獨的線程。但它看起來像粗糙的多線程一樣走路和說話。是嗎?
查看完整描述

3 回答

?
元芳怎么了

TA貢獻1798條經驗 獲得超7個贊

是在用async粗人await的線嗎?

一點都不。它只是使用 promises 的語法糖(真的非常有用的糖),而這又只是一種(真的非常有用的)使用回調的形式化方式。它很有用,因為您可以異步等待(不阻塞 JavaScript 主線程)本質上是異步的事物(如 HTTP 請求)。

如果您需要使用線程,請使用web workers、Node.js worker threads或您的環境提供的任何多線程。根據規范(現在),一次只允許一個線程在給定的 JavaScript“領域”(非常松散:您的代碼運行的全局環境及其關聯的對象等)中工作,因此只有一個線程一次可以訪問該領域內的變量等,但線程可以通過消息傳遞(包括在它們之間傳輸對象而不制作副本)和共享內存進行協作。

例如:


async function isThisLikeTwoThreads() {

 const a = slowFunction();

 const b = fastFunction();

 console.log(await a, await b);

}

isThisLikeTwoThreads以下是調用時代碼的作用:

  1. slowFunction同步調用并將其返回值分配給a.

  2. fastFunction同步調用并將其返回值分配給b.

  3. isThisLikeTwoThreads到達時await a,它包裝a在一個承諾中(就像你做的那樣Promise.resolve(a))并返回一個新的承諾(不是同一個)。讓我們調用圍繞a“ aPromise”的承諾和函數“ functionPromise”返回的承諾。

  4. 稍后aPromise結算時,如果被拒絕functionPromise,則以相同的拒絕原因拒絕,并跳過以下步驟;如果滿足,則下一步完成

  5. 中的代碼isThisLikeTwoThreads繼續包裝b在 promise ( bPromise) 中并等待其解決

  6. 結算時bPromise,如果被拒絕functionPromise則以同樣的拒絕原因被拒絕;如果已實現,則中的代碼isThisLikeTwoThreads會繼續記錄實現值aPromisebPromise然后functionPromise用該值實現undefined

上面的所有工作都是在完成調用的 JavaScript 線程上isThisLikeTwoThreads完成的,但它分布在多個“作業”(JavaScript 術語;HTML 規范稱它們為“任務”,并詳細說明了它們如何進行'在瀏覽器上處理)。如果slowFunctionfastFunction啟動了一個異步進程并為此返回了一個承諾,那么當 JavaScript 線程正在做其他事情時,該異步進程(例如,瀏覽器執行的 HTTP 調用)可能會繼續與 JavaScript 線程并行,或者(如果它也在主線程上的 JavaScript 代碼)可能已經競爭 JavaScript 線程上的其他工作(通過將作業添加到作業隊列和線程在循環中處理它們來競爭)。

但是使用 promises 不會添加線程。:-)


查看完整回答
反對 回復 2022-12-09
?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

我建議您閱讀本文以了解答案是否定的:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop


總而言之,運行時使用多個線程進行內部操作(網絡、磁盤...用于 Node.js 環境、渲染、indexedDB、網絡...用于瀏覽器環境)但是您編寫的 JavaScript 代碼和您從中導入的代碼不同的庫將始終在單個線程中執行。異步操作會觸發回調,回調會一個一個排隊執行。


基本上執行此功能時會發生什么:


async function isThisLikeTwoThreads() {

 const a = slowFunction();

 const b = fastFunction();

 console.log(await a, await b);

}

執行slowFunction。執行fastFunction。當promise 和promise 已解決時,將其余代碼 ( console.log(await a, await b))入隊。在返回后以及可能的排隊回調返回后,在同一線程中運行。假設和都返回承諾,這相當于:abconsole.log isThisLikeTwoThreadsslowFunctionfastFunction


function isThisLikeTwoThreads() {

 const a = slowFunction();

 const b = fastFunction();

 a.then(aResult => b.then(bResult => console.log(aResult, bResult)));

}


查看完整回答
反對 回復 2022-12-09
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

相似但不相同。Javascript 一次只會做“一件事”。它基本上是單線程的。也就是說,它可能看起來很奇怪,因為結果可能似乎以不同的順序到達 - 異步和等待等功能加劇了這種情況。


例如,即使您以 70fps 的速度渲染后臺進程,在可用于完成承諾或接收事件通知的渲染邏輯中也存在小間隙——正是在這些時刻,承諾完成,給人以多線程的錯覺。


如果你真的想鎖定瀏覽器,試試這個:


let a = 1;


while (a == 1){

    console.log("doing a thing");

}

你永遠不會讓 javascript 再次工作,而 chrome 或任何會扼殺你的腳本的東西。原因是當它進入該循環時——沒有任何東西會再次接觸它,不會呈現任何事件,也不會傳遞任何承諾——因此,單線程。


如果這是一個真正的多線程環境,您可以通過將變量更改為新值來從外部打破該循環。


查看完整回答
反對 回復 2022-12-09
  • 3 回答
  • 0 關注
  • 259 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號