基本原理
async作为一个关键字放在函数前面,表示该函数是一个异步函数,异步函数意味着该函数的执行不会阻塞后面代码的执行;而await用于等待一个异步方法执行完成;async/await的作用就是使异步操作以同步的方式去执行。
const getData = (count)=>{
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(count*3)
},2000)
})
}
async function countAll() {
const firstResult = await getData(1);
// 1s 后打印 3
console.log('firstResult: ', firstResult); //firstResult: 3
// 等待 firstPromise 的状态发生变化后执行
const nextResult = await getData(firstResult); //nextResult: 9
// 2s 后打印 9
console.log('nextResult: ', nextResult);
return nextResult;
}
countAll().then((e)=>{
console.log(e) //9
}).catch((error)=>{
console.log(error)
})
简单总结
-
调用
async函数后返回的是一个 Promise 对象,通过then回调可以拿到 async 函数内部return语句的返回值 -
调用
async函数后返回的 Promise 对象必须等待内部所有await对应的 Promise 执行完(这使得async函数可能是阻塞式执行)后才会发生状态变化,除非中途遇到了return语句 -
await命令后如果是 Promise 对象,则返回 Promise 对象处理后的结果,如果是原始数据类型,则直接返回原始数据类型 -
async函数内部抛出的错误,会导致函数返回的 Promise 对象变为rejected状态,从而可以通过catch捕获 -
await会阻塞代码的执行,await一定写在async标记的函数内部
-
带 async 关键字的函数,它使得你的函数的返回值必定是 promise 对象
async带的函数一定有promise对象,如果其中有 await 那就是等,等到await Promise对象再进行返回。
其实await不仅仅用于等Promise对象,还可以等任意表达式,所以await后面实际是可以接普通函数调用或者直接量的,不过我们更多的是放一个返回promise 对象的表达式。他等待的是promise对象执行完毕,并返回结果。