js中的async await,你需要了解的

初步瞭解

先從字面意思來理解,async 是“異步”的意思,而 await 是等待的意思。所以應該很好理解 async 用於申明一個 異步的function(實際上是async function 對象),而 await 用於等待一個異步任務執行完成的的結果。並且 await 只能出現在 async 函數中

async操作符

async function testAsync() {
        return "hello async";
}
const data = testAsync();
console.log(data)

控制檯打印結果如下:
在這裏插入圖片描述
所以說,

  • 當調用一個 async 函數時,會返回一個 Promise 對象。

  • 當async 函數返回一個值時,Promise 的 resolve 方法會負責傳遞這個值。

  • 當 async 函數拋出異常時,Promise 的 reject 方法也會傳遞這個異常值。

  • async 函數中可能會有 await 表達式,await表達式會使 async 函數暫停執行,直到表達式中的 Promise 解析完成後繼續執行 async中await 後面的代碼並返回解決結果。

注意, await 關鍵字僅僅在 async function中有效

由於返回的是一個promise,故可以使用如下方法

 async function testAsync() {
     return "hello async";
 }
 let data = testAsync().then( (data) => {
     console.log(data) // hello async
     return data
 });
 console.log(data);

await 操作符

async 函數返回一個 Promise 對象,當函數執行的時候,一旦遇到 await 就會先返回,等到觸發的異步操作完成,再接着執行函數體內後面的語句。

    function say() {
        return new Promise(function(resolve, reject) {
            setTimeout(function() {
                let age = 26
                resolve(`hello, joel。今年我 ${age} 歲`);
            }, 1000);
        });
    }

    async function demo() {
        const v = await say(); // 輸出:hello, joel。今年我 26 歲  等待這個say 的異步,如果成功把回調 resole 函數的參數作爲結果
        console.log(v);
    }
    demo();

在這裏插入圖片描述

wait表達式返回值:

  • 假如wait後面的這個表達式如果返回的是一個Promise 對象, 那麼它的返回值,實際上就是 Promise 的回調函數 resolve 的參數,如果這個Promise rejected 了,await 表達式會把 Promise 的異常拋出。
  • 假如這個表達式如果返回的是一個常量,那麼會把這個常量轉爲Promise.resolve(xx),同理如果沒有返回值也是Promise.resolve(underfind)

總結

  • async 告訴程序這是一個異步,awiat 會暫停執行async中的代碼,等待await 表達式後面的結果,跳過async 函數,繼續執行後面代碼
  • async 函數會返回一個Promise 對象,那麼當 async 函數返回一個值時,Promise 的 resolve 方法會負責傳遞這個值;當 async 函數拋出異常時,Promise 的 reject 方法也會傳遞這個異常值
  • await 操作符用於等待一個Promise 對象,並且返回 Promise 對象的處理結果(成功把resolve 函數參數作爲await 表達式的值),如果等待的不是 Promise 對象,則用 Promise.resolve(xx) 轉化

參考鏈接:https://www.cnblogs.com/CandyManPing/p/9384104.html#_label0
作者:風吹De麥浪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章