async 代表这是一个异步函数(里面可以有同步的代码),await 后面可以跟任何的JS 表达式,但是它最主要的意图是用来等待 Promise 对象的状态被 resolved。async返回promise对象,async函数像是把函数里面所有异步函数包装成一个promise对象,async函数return的值等于.then()里面回调函数的参数。
- 如果await后面是 promise对象会造成异步函数停止执行并且等待 promise 的解决,如果promise状态由pedding变为resolved则继续往下执行,如果某个promise状态由pedding变为rejected,则不往下执行,且出错的await的reject信息会作为async返回的promise的信息(promise对象是放到异步微任务队列中的,不会阻塞主线程先执行同步代码),如果不想因为前面的await的promise出错而影响后面的await的promise执行,则可以使用try…catch…的方式,把可能出错的代码放到try中。
- 如果await后面是 正常的表达式则按正常顺序执行
async await的优势
async await 与promise一样,都是无阻塞的,
并且async await可以让异步代码看着像同步代码一样顺序执行(这是在await后面是promise对象的前提下,才会看着像顺序执行,普通表达式的话加await跟没加效果一样)
async function test(){
console.log('我是异步函数里面的东西1')
var a =await new Promise((resolve)=>{
setTimeout(() => {
resolve() //resolve()把pedding状态变为resolved,如果这里不resolve(),则await一直等不到状态变化,就会一直卡在这里,下面的await也不会执行
console.log('我是第一个await的settimeout')
}, 2000)
})
var b =await new Promise((resolve)=>{
setTimeout(() => {
resolve()
console.log('我是第二个await的settimeout')
}, 2000)
})
console.log('我是异步函数里面的东西2')
}
test()
console.log('我是异步函数外面的东西')
我是异步函数里面的东西1
我是异步函数外面的东西 //说明无阻塞
//2秒后
我是第一个await的settimeout
//再过2秒后
我是第二个await的settimeout
我是异步函数里面的东西2
async function test(){
var c =await new Promise((resolve)=>{
setTimeout(() => {
resolve('我是第一个正确的promise')
}, 2000)
})
var a =await new Promise((resolve,reject)=>{
setTimeout(() => {
reject('我是第一个出错的promise')
}, 2000)
})
var b =await new Promise((resolve)=>{
setTimeout(() => {
resolve('我是第一个正确的promise')
}, 2000)
})
} ;
test().then((data)=>{
console.log(data)
},(err)=>{
console.log(err)
})
我是第一个出错的promise