await會阻塞其所在表示式中後續表示式的執行

2021-09-11 21:32:23 字數 1184 閱讀 7992

在進入正文之前,我們首先來看一段**,這段**會輸出什麼呢?

let x = 0;

async

function

test()

test();

x = 1;

複製**

輸出3?還是2?正確答案是:2

首先我們先記住一句話,那就是非同步函式(async方式宣告的函式)不代表其函式內部的所有**都是非同步方式執行的,這句話什麼意思呢?通俗講就是:在第乙個await表示式出現之前,非同步函式內部的**都是按照同步方式執行的,記住這句話以後我們再繼續往下看

那麼在test函式內部,哪些**是按同步方式執行的呢?首先我們可以將x += await 2這行**稍微變換一下形式,變換為:x = x + await 2,表示式右邊的x是取值操作,並且按同步方式執行的,所以在執行到await時,右邊的x已經取值完成,並且被取到的值0替換,然後才輪到test函式外的x = 1這行**執行,x += await 2相當於x = 0 + await 2,所以最終輸出:2

現在,我們稍微對上面的**做一下修改:

let x = 0;

async

function

test()

test();

x = 1;

複製**

如果你已經明白了前面我所說的,那麼我想你應該可以給出正確的答案,那就是輸出:3。原因是:await 2這次被放在了x表示式的前面,所以x的取值操作是非同步執行的,也就是說x = 1會先被執行,然後才是test函式中x的取值操作,由於test函式中的x形成了閉包,所以x = (await 2) + x相當於x = (await 2) + 1,所以最終輸出:3

上面**的關鍵是:test函式中x的取值操作與x = 1這行**執行順序先後的問題,所以我們可以得出乙個結論:await會阻塞其所在表示式中後續表示式的執行

前序表示式 中序表示式 後序表示式

執行完成後,先輸出佇列內容,在輸出棧內容,最終結果即是後序表示式 先序表示式 後序表示式 public string infixtopostfix string elements if s.equals continue 碰到 或 運算子 if s.equals s.equals while sta...

「中序表示式」轉換為「前序表示式」 「後序表示式」

首先看下面所示 中序表示式 2 3 2 1 3 4 1 前序表示式 23 21 3 41 後序表示式 23 21 341 中序表示式對我們而言是很直觀的 我們平時接觸的就是這個 但計算機處理起來比較麻煩 括號 優先順序之類的 前序和後序表示式中沒有括號,而且在計算中只需單向掃瞄,不需要考慮運算子的優...

中序表示式轉字尾表示式

3 4 5 6 這種寫法是中序表示式 而後序表示式則是將運算子放在運算元的後面,如 3 4 5 6 可以看出後序表示式中沒有括號,只表達了計算的順序,而這個順序恰好就是計算器中的一般計算順序。建立乙個棧s 從左到右讀表示式,如果讀到運算元就將它壓入棧s中,如果讀到n元運算子 即需要引數個數為n的運算...