async 和 await
来源于我的有道云笔记,日期:2022.08.10
async 函数
由 async 修饰的函数为异步函数,返回结果是一个 Promise 对象。
asyncFun = async function() {
console.log("异步函数");
return 1;
}
asyncFun.then((e) => {
console.log(e);
})
语句输出:
1
如果 async 函数返回的是一个 Promise 对象,比如:
async function f(){
let p = new Promise((res,rej)=>{
})
return p;
}
f().then().catch();
此情况就和一般的 async 函数一样,没有什么差异,直接输出 p 会得到 promise 对象,而且需要 then 和 catch 来获取其内部 p 的结果。
async function f(){
let p = await new Promise((res,rej)=>{
})
return p;
}
此时返回的 p 就是 res 或 rej 的参数,就和普通函数返回的一样,但如果直接输出 f 函数,得到的依然是一个 promise 对象,而且 then 和 catch 失效。
如果 await 后面的异步操作出错,那么等同于 async 函数返回的 Promise 对象被 reject。
async function f() {
await new Promise(function (resolve, reject) {
throw new Error('出错了');
});
}
f()
.then(v => console.log(v))
.catch(e => console.log(e))
// Error:出错了
防止出错的方法
将其放在 try...catch 代码块之中。
async function main() {
try {
const val1 = await firstStep();
const val2 = await secondStep(val1);
const val3 = await thirdStep(val1, val2);
console.log('Final: ', val3);
}
catch (err) {
console.error(err);
}
}
说白了,async 也是一个 Promise 对象,我们可以在 async 后面加上 then 或者 catch 这个东西来防止出错。
await 语句
需要注意一些点:
await必须在async函数内才可以使用。- 单一的
promise对象也可以使用。 - 其作用是阻塞代码的继续执行。
asyncFun = async function(){
let n = await new Promise((res)=>{
res("ok");
})
return n;
}
result = async function(){
console.log(await asyncFun());
}
result();
语句输出:
ok

浙公网安备 33010602011771号