async&await

本文介绍了async函数和await关键字在处理异步操作中的作用。async函数返回一个Promise对象,根据是否有错误决定其状态。await只能在async函数内部使用,用于等待异步操作完成。当await后的Promise解析时,会返回解析值;如果抛出错误,则会进入catch块。此外,文章还探讨了事件循环的概念,包括宏任务和微任务的执行顺序。

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

1. async函数

返回一个promise对象。若返回值出现代码逻辑错误,那promise的状态就为rejected/失败,用.catch捕获;若返回值没有错误,那promise的状态就为resolve/成功,并且将return的结果作为参数,传给它的.then方法。

        async function fn(){
            return '函数执行结果';
            // return y;
        };
        const res = fn();
        console.log(res);  //打印一个状态为fulfilled,结果为'函数执行结果'的promise对象
                           //return的代码逻辑错误时,打印一个状态为rejected,结果为'y is not defined'的对象
        res.then(r=>{
            console.log(r);  //'函数执行结果'
        }).catch(e=>{
            console.log(e);  //return y 时,结果为'y is not defined'
        })

2. await

需要写在async函数内部,为了等待异步操作。如果异步操作前写了await,就需要等到这个异步执行完成并产生结果,await后面的代码才能执行。如果异步操作的结果为成功,直接返回结果;如果异步操作的结果为失败,浏览器自动抛出异常,需要捕获失败的结果。 await后面跟对象,那返回的就是resolve/reject的结果

如果await后跟的不是promise对象,那直接返回原来的值。

        async function gn(){
            const data = await new Promise((res,rej)=>{
                res('异步成功的结果');
                // rej('异步失败的结果')
            })
            console.log('await后面的代码');  //res调用时 打印'await后面的代码'
                                            //rej调用时,不打印
        }
        gn().then(r=>{
            console.log(r);  //res调用时 打印'异步成功的结果'
                             
        }).catch(e=>{
            console.log(e);  //rej调用时,打印'异步失败的结果'
        })

await是为了等待异步结果,它本身是属于同步代码,它之后的代码在异步操作成功后才生效,属于异步代码,需要同步代码执行完后才能执行。 

await的使用形式:可以用在箭头函数、函数定义式、对象、class中。

//箭头函数
const fn = async()=>{ }
//函数表达式
var b = async function(){ }
//对象的方法
var obj = {
    async getName(){
        console.log('111');
     },
    sayHello:async function(){ 
        console.log('222');
    }
 }
//类
class Cat {
    constructor(){
        this.sayAge = async function(){ };
    async run(){ };
    static async pull(){ };
}    

3. 事件循环

总代码分为同步任务(主线程)和异步任务,异步任务分为微任务和宏任务

执行顺序:先同步,再微,后宏

宏任务:script(整体代码)、setTimeout

微任务:Promise.then、await之后的代码

案例:

async function async1() {
      console.log('async1 start');   //同步
      await async2();   //同步
      console.log('async1 end');  //异步1 await之后的为微任务
        }
      async function async2() {
         console.log('async2');  //同步
       }
console.log('script start');    //同步
setTimeout(function () {
    console.log('setTimeout');
   }, 0);   //异步 宏任务
async1();   //同步
new Promise(function (resolve) {
    console.log('promise1');   //同步
    resolve();
    }).then(function () {   //异步2
            console.log('promise2');
   });
console.log('script end');    //同步
//打印顺序:
script start/async1 start/async2/promise1/script enda/sync1 end/promise2/setTimeout

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值