1.异步函数声明
1.1async关键字
async
关键字可以用在函数声明、函数表达式、箭头函数和方法上,以代表此函数为异步函数,并非普通函数。
await
关键字只能在以 async
关键字声明的异步函数中使用,且异步函数中至少含有一个 await
关键字,不然异步函数就毫无意义地等同于普通函数。
//函数声明
async function 函数名(参数) {
await 表达式;
}
//函数表达式
let 变量 = async function(参数) {
await 表达式;
};
//箭头函数
let 变量 = async (参数) => {
await 表达式;
};
//方法
class 类名 {
async 方法名(参数) {
await 表达式;
}
}
1.2await关键字
await 表达式;
await
关键字后的表达式可以是 实现了 Thenable
接口的对象(期约对象也属于其中一种) 或 任意类型的值。
如果是实现了 Thenable
接口的对象(期约对象也属于其中一种),则由 await
来“解包”。
当 await
关键字接收一个期约对象 p
时,表达式 await p
会一直等到 p
落定(settled)。如果 p
解决(resolved),那么 await p
表达式的值就是解决 p
的值。如果 p
被拒绝(rejected),那么 await p
表达式就会抛出拒绝 p
的异常。
如果是任意类型的值,则会被Promise.resolve()
包装成一个期约对象,当作已经解决(resolved)的期约。
我们通常并不会使用 await
关键字来接收一个保存期约的变量,更多的是把它放在一个会返回期约对象的函数调用前面。
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
async function asyncCall() {
console.log('calling');
const result = await resolveAfter2Seconds();
console.log(result);
// Expected output: "resolved"
}
asyncCall();
//输出
calling
resolved
2.参数
异步函数的参数具有与普通函数一样的正常行为。
3.返回值
异步函数的返回值可以是 实现了 Thenable
接口的对象(期约对象也属于其中一种) 或 任意类型的值。
如果是实现了 Thenable
接口的对象(期约对象也属于其中一种),则由提供给 then()
的处理程序 来“解包”。
如果是任意类型的值,则会被Promise.resolve()
包装成一个期约对象,当作已经解决(resolved)的期约。
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/javascript/javascriptlang/21545.html