async await到底是什麼?怎麼用?

2021-10-10 21:11:17 字數 2585 閱讀 5744

1)方便級聯呼叫:即呼叫依次發生的場景;

2)同步**編寫方式: promise使用then函式進行鏈式呼叫,一直點點點,是一種從左向右的橫向寫法;async/await從上到下,順序執行,就像寫同步**一樣,更符合**編寫習慣;

3)多個引數傳遞: promise的then函式只能傳遞乙個引數,雖然可以通過包裝成物件來傳遞多個引數,但是會導致傳遞冗餘資訊,頻繁的解析又重新組合引數,比較麻煩;async/await沒有這個限制,可以當做普通的區域性變數來處理,用let或者const定義的塊級變數想怎麼用就怎麼用,想定義幾個就定義幾個,完全沒有限制,也沒有冗餘工作;

4)同步**和非同步**可以一起編寫: 使用promise的時候最好將同步**和非同步**放在不同的then節點中,這樣結構更加清晰;async/await整個書寫習慣都是同步的,不需要糾結同步和非同步的區別,當然,非同步過程需要包裝成乙個promise物件放在await關鍵字後面;

5)基於協程: promise是根據函式式程式設計的正規化,對非同步過程進行了一層封裝,async/await基於協程的機制,是真正的「儲存上下文,控制權切換……控制權恢復,取回上下文」這種機制,是對非同步過程更精確的一種描述;

6)async/await是對promise的優化: async/await是基於promise的,是進一步的一種優化,不過在寫**時,promise本身的api出現得很少,很接近同步**的寫法;

先說一下async的用法,它作為乙個關鍵字放到函式前面,用於表示函式是乙個非同步函式,因為async就是非同步的意思, 非同步函式也就意味著該函式的執行不會阻塞後面**的執行。

語法很簡單,就是在函式前面加上async 關鍵字,來表示它是非同步的,那怎麼呼叫呢?async 函式也是函式,平時我們怎麼使用函式就怎麼使用它,直接加括號呼叫就可以了,為了表示它沒有阻塞它後面**的執行,我們在async 函式呼叫之後加一句console.log;

async

function

timeout()

timeout()

;console.

log(

'雖然在後面,但是我先執行'

);

async 函式 timeout 呼叫了,但是沒有任何輸出,它不是應該返回 『hello world』, 先不要著急, 看一看timeout()執行返回了什麼? 把上面的 timeout() 語句改為console.log(timeout())

async

function

timeout()

console.

log(

timeout()

);console.

log(

'雖然在後面,但是我先執行'

);

原來async 函式返回的是乙個promise 物件,如果要獲取到promise 返回值,我們應該用then 方法, 繼續修改**

async

function

timeout()

timeout()

.then

(result

=>

)console.

log(

'雖然在後面,但是我先執行'

);

我們獲取到了"hello world』, 同時timeout 的執行也沒有阻塞後面**的執行,和 我們剛才說的一致。

這時,你可能注意到控制台中的promise 有乙個resolved,這是async 函式內部的實現原理。如果async 函式中有返回乙個值 ,當呼叫該函式時,內部會呼叫promise.solve() 方法把它轉化成乙個promise 物件作為返回,但如果timeout 函式內部丟擲錯誤呢? 那麼就會呼叫promise.reject() 返回乙個promise 物件, 這時修改一下timeout 函式

async

function

timeout

(flag

)else

}console.

log(

timeout

(true))

// 呼叫promise.resolve() 返回promise 物件。

console.

log(

timeout

(false))

;// 呼叫promise.reject() 返回promise 物件。

如果函式內部丟擲錯誤, promise 物件有乙個catch 方法進行捕獲。

timeout

(false).

catch

(err

=>

)

async 關鍵字差不多了,我們再來考慮await 關鍵字,await是等待的意思,那麼它等待什麼呢,它後面跟著什麼呢?其實它後面可以放任何表示式,不過我們更多的是放乙個返回promise 物件的表示式。注意await 關鍵字只能放到async 函式裡面

敏捷到底是什麼?

文 ivar jacobson 在支援軟體工程 比如rational統一過程rup 與敏捷陣營 比如scrum或是xp 之間,人們一直存在著衝突。也不難理解,因為這兩種方法間都是在用著彼此並不相容的方式來描述的。其實大可不必,因為他們背後的觀點全然是相輔相成的。關鍵在於該如何用對兩者來說都公平的方式...

我們到底是什麼?

我們到底是什麼?我們是一種生物電流 生物電流有幾種狀態,喜怒哀樂等,可以根據外部環境進行自我切換 該種生物電流附屬在一種器官硬體上面 我們可以從器官硬體上感知一些資訊,產生新的資訊生物電流,新產生的生物電流符合原先的標準 我們可以把資訊電流儲存在器官硬體上,但具體如何儲存等資訊無法被我們感知 我們的...

SDN到底是什麼

sdn到底是什麼?雖然這個概念已經被炒到了,但還沒有人對其給出乙個明確的概念。盛科網路總監張衛峰撰寫了自己關注sdn以來,對其認識的四個階段,最後乙個階段又回到了sdn字面的意思軟體定義網路,每個階段作者的新觀點,也會給我們帶來一些啟發。以下為原文 我對sdn的認識可以分為四個階段,最後乙個階段是在...