async 与 await
1. async 函数
async
函数返回的是Promise
对象。Promise对象的结果由async函数执行的返回值决定。
(1)如果返回的是字符串、数字、null、undefined、或 没有返回值等,得到的是状态为Fulfilled
的promise
对象。
async function fn(){
return 'hello';
}
console.log(fn());
(2)若函数内部抛出错误会导致返回的 Promise 对象变为 reject 状态
async function fn(){
throw new Error('出错啦!!!')
}
console.log(fn());
(3)如果返回的是一个Promise对象,则其返回的Promise的状态由这个对象决定。
async function fn(){
return new Promise((resolve,reject)=>{
// resolve('成功啦')
reject('出错啦')
})
}
console.log(fn());
2. await 命令
await必须写在async函数中,右侧的表达式一般为promise对象
const p = new Promise(resolve=>{
resolve('我成功啦')
})
async function fn(){
let aw =await p;
console.log(aw);
}
fn();
只要一个await语句后面的Promise变为reject,那么整个async函数都会中断执行。
async function fn(){
let p1 = await Promise.resolve('成功了')
console.log(p1);
let p2 = await Promise.reject('出错了')
console.log(p2);
let p3 = await Promise.resolve('hello~')
console.log(p3);
}
fn();
console.log(p2);
之后的语句都不会被执行,因为第二个await语句状态已经变为reject了
这时可以将第二个await放在try...catch
结果里面,这样不管这个异步操作是否成功,都不会中断后面的异步操作。
async function fn(){
let p1 = await Promise.resolve('成功了')
console.log(p1);
try{
let p2 = await Promise.reject('出错了')
console.log(p2);
}catch(e){}
let p3 = await Promise.resolve('hello~')
console.log(p3);
}
fn();
或在 await后面的Promise对象后添加一个catch方法,处理前面可能出现的错误
async function fn(){
let p1 = await Promise.resolve('成功了')
console.log(p1);
let p2 = await Promise.reject('出错了').catch(e=>console.log(e))
let p3 = await Promise.resolve('hello~')
console.log(p3);
}
fn();
注意:
async函数返回的Promise对象必须等到内部所有await命令后面的Promise对象执行完才会发生状态改变,除非遇到return语句或抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数