async和await的講解

2021-09-24 06:41:41 字數 2181 閱讀 9115

//普通的函式宣告

async function a(){}

複製**

//宣告乙個函式表示式

let a=async function(){}

複製**

//async形式的箭頭函式

let a=async ()=>{}

複製**

async與await例項應用,基礎** 控制器呼叫與server中查詢資料

exports.getbloglist =async (ctx,next)=>
exports.getbloglistserver= async ()=> let bloglist= await articleblogda.findall(); console.log("哈哈哈"+bloglist); return bloglist; }

複製**複製**

方法執行後的返回值:await命令後面可以是promise物件或值,如果是值,就會轉到乙個立即resolve的promise物件。async函式返回的是乙個promise物件,如果結果是值,會經過promise包裝返回。

await與並行:如果在乙個async的方法中,有多個await操作的時候,程式會變成完全的序列操作,乙個完事等另乙個但是為了發揮node的非同步優勢,當非同步操作之間不存在結果的依賴關係時,可以使用promise.all來實現並行,all中的所有方法是一同執行的。

執行後的結果:async函式中,如果有多個await關鍵字時,如果有乙個await的狀態變成了rejected,那麼後面的操作都不會繼續執行,promise也是同理await的返回結果就是後面promise執行的結果,可能是resolves或者rejected的值使用場景迴圈遍歷方便了**需要同步的操作(檔案讀取,資料庫操作等)

async與await一些注意關鍵點小結

async函式中,如果有多個await關鍵字時,如果有乙個await的狀態變成了rejected,那麼後面的操作都不會繼續執行,promise也是同理有這樣乙個函式async

function getdata()

複製**

直接呼叫

var value=getdata();

複製**

是對於這個函式直接呼叫的時候並不是你想要的返回值,因為async方法返回的永遠是乙個promise,即使開發者返回的是乙個常量,也會被自動呼叫的promise.resolve方法轉換為乙個promise。因此對於這種情況,上層呼叫方法也需要是async函式,採用如下方法

async function ***x()

複製**

對於這種呼叫,如果還存在更高層次的方法呼叫,那麼從底層的非同步操作開始,一直到最頂層乙個不需要返回值的函式為止,全部的方法都要變成async。

這個誤區在一道面試題那篇文章中詳細講解過,但是還是想提一下。 看一段**:

async function async1()

async function async2()

async1();

console.log('i am koala')

複製**

我想會有一些開發者認為await是把同步變為非同步,執行順序是這樣

async1 start

async2

async1 end

i am koala

複製**

然而並不是,正確的執行順序是

async1 start

async2

i am koala

async1 end

複製**

解釋一下原因:

「 async 函式返回乙個 promise 物件,當函式執行的時候,一旦遇到 await 就會先返回,等到觸發的非同步操作完成,再接著執行函式體內後面的語句。」 ——阮一峰es6

簡單的說,先去執行後面的同步任務**,執行完成後,也就是表示式中的 promise 解析完成後繼續執行 async 函式並返回解決結果。(其實還是本輪迴圈promise的問題,最後的resolve屬於非同步,位於本輪迴圈的末尾。)

async和await的講解

async和await的講解 宣告async函式的幾個方法 普通的函式宣告 async function a 宣告乙個函式表示式 let a async function async形式的箭頭函式 let a async 初識async和await async與await例項應用,基礎 控制器呼叫與...

async和await的使用

async其實是es7的才有的,是非同步操作的進化,其實就是封裝乙個promise的物件返回 async function test console.log test promiseasync方法在普通的函式前加上 async 關鍵字即可。執行這個函式,發現並沒有返回1111,而是通過promise...

await和async的機制

await 一般會和 async 一起使用,async 是非同步,await則是等待非同步的返回值。可以看下面的測試 public async task string call public async task int foo 執行結果 1 3 4 2這裡在await 後的方法執行完之後,才會向下...