async await的基礎用法

2021-09-29 11:09:12 字數 2182 閱讀 3120

async關鍵字

1)表明程式裡面可能有非同步過程: async關鍵字表明程式裡面可能有非同步過程,裡面可以有await關鍵字;當然全部是同步**也沒關係,但是這樣async關鍵字就顯得多餘了;

2)非阻塞: async函式裡面如果有非同步過程會等待,但是async函式本身會馬上返回,不會阻塞當前執行緒,可以簡單認為,async函式工作在主線程,同步執行,不會阻塞介面渲染,async函式內部由await關鍵字修飾的非同步過程,工作在相應的協程上,會阻塞等待非同步任務的完成再返回;

3)async函式返回型別為promise物件: 這是和普通函式本質上不同的地方,也是使用時重點注意的地方;

(1)return newpromise();這個符合async函式本意;

(2)return data;這個是同步函式的寫法,這裡是要特別注意的,這個時候,其實就相當於promise.resolve(data);還是乙個promise物件,但是在呼叫async函式的地方通過簡單的=是拿不到這個data的,因為返回值是乙個promise物件,所以需要用.then(data => )函式才可以拿到這個data;

(3)如果沒有返回值,相當於返回了promise.resolve(undefined);

4)無等待 聯想到promise的特點,在沒有await的情況下執行async函式,它會立即執行,返回乙個promise物件,並且絕對不會阻塞後面的語句,這和普通返回promise物件的函式並無二致;

5)await不處理非同步error: await是不管非同步過程的reject(error)訊息的,async函式返回的這個promise物件的catch函式負責統一抓取內部所有非同步過程的錯誤;async函式內部只要有乙個非同步過程發生錯誤,整個執行過程就中斷,這個返回的promise物件的catch就能抓取到這個錯誤;

5)async函式的執行: async函式執行和普通函式一樣,函式名帶個()就可以了,引數個數隨意,沒有限制,也需要有async關鍵字;只是返回值是乙個promise物件,可以用then函式得到返回值,用catch抓整個流程中發生的錯誤;

await關鍵字

1)await只能在async函式內部使用:不能放在普通函式裡面,否則會報錯;

2)await關鍵字後面跟promise物件:在pending狀態時,相應的協程會交出控制權,進入等待狀態,這是協程的本質;

3)await是async wait的意思: wait的是resolve(data)的訊息,並把資料data返回,比如下面**中,當promise物件由pending變為resolved的時候,變數a就等於data,然後再順序執行下面的語句console.log(a),這真的是等待,真的是順序執行,表現和同步**幾乎一模一樣;

const a = await new promise((resolve, reject) => );

console.log(a);

4)await後面也可以跟同步**: 不過系統會自動將其轉化成乙個promsie物件,比如:

const a = await 『hello world』

// 相當於

const a = await promise.resolve(『hello world』);

// 跟同步**是一樣的,還不如省事點,直接去掉await關鍵字

const a = 『hello world』;

5)await對於失敗訊息的處理: await只關心非同步過程成功的訊息resolve(data),拿到相應的資料data,至於失敗訊息reject(error),不關心不處理;對於錯誤的處理有以下幾種方法供選擇:

(1)讓await後面的promise物件自己catch;

(2)也可以讓外面的async函式返回的promise物件統一catch;

(3)像同步**一樣,放在乙個try…catch結構中;

async componentdidmount()

} catch (error)

}6)await對於結果的處理: await是個運算子,用於組成表示式,await表示式的運算結果取決於它等的東西,如果它等到的不是乙個promise物件,那麼await表示式的運算結果就是它等到的東西;如果它等到的是乙個promise物件,await就忙起來了,它會阻塞其後面的**,等著promise物件resolve,然後得到resolve的值,作為await表示式的運算結果;雖然是阻塞,但async函式呼叫並不會造成阻塞,它內部所有的阻塞都被封裝在乙個promise物件中非同步執行,這也正是await必須用在async函式中的原因;

Promise和Async Await用法整理

一 promise 1 簡介 promise,簡單來說就是乙個容器,裡面儲存著某個未來才會結束的時間 通常是乙個非同步操作的結果 promise的基本語法 new promise resolve,reject 從語法上來說,promise是乙個物件,從它可以獲取非同步操作的訊息 基本語法 let p...

C 非同步操作 async await 的用法

1.async與 await 成對出現 async 在方法前使用 方法體面麵用 await 2.使用async 和await定義非同步方法不會建立新執行緒.3.await 後面一定是乙個掃行時間長的任務,要用 task.run 類似的 來執行.4.返回寫成 task.後面的 要等 這個執行完後 再執...

C 關鍵字async await用法

經過一番的探索,終於搞清楚關鍵字async await 在.net4.5之後可用的巧妙之處,在這裡記錄一下也與大家分享一下個人的心得體會 async 非同步執行 await 非同步執行中的等待其執行完 最大的優點是它是後台等待,因此不阻塞gui,介面互動非常的好 使用async方法要定義async ...