async await

本文深入探讨了async/await语法糖在JavaScript异步编程中的应用,解释了其如何简化Promise链,使得异步代码更接近于同步代码的书写方式。通过示例展示了await操作符在处理Promise对象时的作用,以及如何优雅地处理异步错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值