- async function 關鍵字可以用來定義一個異步函數表達式。
語法
async function [name]([param1[, param2[, ..., paramN]]]) {
statements
}
參數
name
函數名稱。可以省略,以此來聲明一個匿名的函數。也是用于本地調用函數體的一個名稱。
paramN
傳入函數的參數名。
statements
函數體內的語句聲明。
簡單的小例子
function resolveAfter2Seconds(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 2000);
});
};
var add1 = async function(x) {
var a = resolveAfter2Seconds(20);
var b = resolveAfter2Seconds(30);
return x + await a + await b;
}
add1(10).then(v => {
console.log(v); // prints 60 after 2 seconds.
});
var add2 = async function(x) {
var a = await resolveAfter2Seconds(20);
var b = await resolveAfter2Seconds(30);
return x + a + b;
};
add2(10).then(v => {
console.log(v); // prints 60 after 4 seconds.
});
- await
await操作符被用于等待由一個async function
返回的一個Promise
。
語法
[*return_value*] = await *expression*;
表達式
一個 Promise
或者 任何等待解析的值。
返回值
返回 promise 的解析值,如果不是 promise,則返回值本身。
**await 表達式會造成異步函數停止執行并且等待 promise 的解決,當值被 resolved,異步函數會恢復執行以及返回 resolved 值。如果該值不是一個 promise,它將會被轉換成一個 resolved 后的 promise。如果 promise 被 rejected,await 表達式會拋出異常值。
示例
- 如果一個 Promise 被傳遞到一個 await 表達,它會等待 Promise 的解析并返回解析的的值。
function resolveAfter2Seconds(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
async function f1() {
var x = await resolveAfter2Seconds(10);
console.log(x); // 10
}
f1();
2.如果該值不是一個 Promise,它將該值轉換為已解決的Promise,并等待它。
async function f2() {
var y = await 20;
console.log(y); // 20
}
f2();
3.如果 promise 被拒絕,則拒絕的值被拋出。
async function f3() {
try {
var z = await Promise.reject(30);
} catch (e) {
console.log(e); // 30
}
}
f3();
瀏覽器兼容性
FireShot Screen Capture #015 - 'Can I use___ Support tables for HTML5, CSS3, etc' - caniuse_com_#search=async.png