es6--async函数和类

async函数

async函数本质上就是 Generator 函数的语法糖。

真正意义上的解决异步回调问题的方案,可以用同步的写法去写异步代码。

代码案例:

        let p1=new Promise((resolve,reject)=>{});
        let p2=new Promise((resolve,reject)=>{});
        let p3=new Promise((resolve,reject)=>{});

        // p1.then(rst=>{
        //     //一堆逻辑 forEach(item=>{})
        //     return p2;
        // }).then(rst=>{
        //     //一堆逻辑
        //     return p3
        // })

        async function fn(){
            await p1;
            await p2;
            await p3;
        }

1.async函数基本用法

通过async关键字来修饰函数,

函数就变成了异步函数.

async函数的返回值为:promise;async函数的return的内容,会成为promise成功状态的数据

代码案例:

        //async函数
        async function fn1() {
            console.log(1);
        }


        async function fn2() {
            console.log(2);
            return 'hello';
        }

        // let v1=fn1();
        // console.log(v1);//Promise {<fulfilled>: undefined}
        let rst = fn2();
        console.log(rst);//Promise {<fulfilled>: 'hello'}

        rst.then(data => {
            console.log(data);
        }).catch(err=>{
            console.log(err);
        })

2.await

await是等待的意思。

1)await必须用于async函数内部

2)await具有等待异步代码执行的功能

3)await可以解析promise成功的结果(不能解析失败的结果)

async function fn(){
   await 异步代码;//等待异步代码执行
}

代码案例: 

  async function fn1() {
            console.log(1);
            return 'hello';
        }

        // fn1().then(rst=>{//promise成功的结果
        //     console.log(rst);
        // })

        // await fn1();//报错

        async function getRst() {
            let v = await fn1();//解析promise成功的结果,赋值给变量v
            console.log(v);
        }

await搭配promise

        let p1 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(10);
            }, 1000);
        });

        // p1.then(rst=>{}).catch(err=>{})//传统方案

        async function fn() {
            let v = await p1;//解析promise成功的解构
            console.log(v);
        }

        fn();

await遇到promise失败的状态:

        let p1 = new Promise((resolve, reject) => {
            setTimeout(() => {
                // resolve(10);
                reject(100)
            }, 1000);
        });

        // p1.then(rst=>{}).catch(err=>{})//传统方案

        //解决方案一:
        async function fn() {
            try {
                let v = await p1;//解析promise成功的解构
                console.log(v);
            } catch (e) {
                console.log('收到错误:', e);
            }
        }
        //解决方案二:
        async function fn(){
            let v=await p1.catch(err=>{//捕获错误、异常、失败
                console.log(err);
            });
            console.log(v);
        }

3.应用

解决回调地狱

代码案例:

 let p1 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(10)
            }, 1000);
        });

        let p2 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(20)
            }, 500);
        });

        let p3 = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(30)
            }, 2000);
        });

        async function fn(){
            let v1=await p1;
            let v2=await p2;
            let v3=await p3;

            console.log(v1);
            console.log(v2);
            console.log(v3);
        }

        fn();

在ES6中新增了class关键字,可以定义类.

  • 类 对事物的一个分类 ,使用class关键字来定义 .类是一种更高级别的封装

  • 对象 类的实例化

1.class的基本使用

语法:

        //Person类
        class Person {
            //构造器  完成类的属性的初始化
            //构造器不能被主动调用
            //构造器会在类被实例化时,自动执行
            constructor(name, age, idCard) {//属性
                this.name = name;
                this.age = age;
                this.idCard = idCard;
            }

            say() {//注意:方法依然位于原型上
                console.log(this.name + "哈哈大笑");
            }
        }

        let p = new Person('李狗子',18,'4102432432');//类的实例化
        console.log(p);

2.constructor

构造器。

每一个类都需要有一个构造器。若没有显式的声明,则系统会自动添加一个无参的构造器。

构造器不能主动调用;当类被实例化的时候,会自动的执行构造器

3.成员和静态

属性:

  • 静态属性 类的属性

  • 成员属性 对象的属性

方法:

  • 静态方法 类的方法

  • 成员方法 对象的方法

     class Man {
                static leg='两条腿';//静态属性
                constructor(id,name) { //成员属性
                    this.id=id;
                    this.name=name;
                }
    
                say() {//成员方法
                    console.log(111);
                }
    
                static walk() {//静态方法
                    console.log(2222);
                }
            }
    
            // Man.say();//报错
            // new Man().say();//对象调用
    
            Man.walk();
            // new Man().walk();//报错
    
            let m=new Man(100,'王小二');
            console.log(m.id);//成员属性
            // console.log(Man.id);
            console.log(Man.leg);
            console.log(m.leg);//undefine

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值