初步瞭解
先從字面意思來理解,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麥浪