ES6中Promise、Async/await解决回调地狱、Proxy代理

1.Promise

作为一些场景必须要使用的一个对象,比如说我们要发送一个请求,但是在发送这个请求之前我们需要以另一个请求返回的结果中的一个数据作为这次请求的参数,也就是说这个请求必须在另一个请求后面,当然我们用setTimeout定时器写一个延时函数也可以,但是当有很多请求的时候回造成一层套一层形成回调地狱。
直接上代码,代码里面注释写的很清楚

<script>
    // 注:下面的.then的err是因为then()有两个参数
    // then((res)=>{},(err)=>{})两个参数都是函数一个是Promise成功的一个是失败的
    const pr = new Promise(function (resolve, reject) {//这个地方一般用箭头函数
        resolve('第一次成功') //成功的时候会给.then一个结果数据
        //reject('失败的信息') //失败的时候会给.catch一个结果数据
    }).then(res => {
        console.log('拿到第一次成功的结果:' + res) //这里的res就是 成功
        //我们拿到第一层成功的结果可以继续在里面执行下一步操作
        return new Promise((resolve, reject) => {
            resolve('第二次成功')
            //这个地方我们又拿到成功的需要再去.then拿到这次成功的结果
        })
    }, err => {
        //我们可能每一次失败都要进行不同的处理,就可以给每一个.then加上错误处理
        console.log('第一次失败' + err)
        throw new Error('报错') //报错了下面的代码就不执行了
    }).then(res => {
        console.log('第二次成功拿到结果:' + res)
    }, err => {
        console.log('第二次失败' + err)
    }).catch(err => {
        console.log(err) //这里的err 就是是失败
    })
    //pending 等待状态
</script>

2.Async/await

这个是基于Promise进行优化的,因为Promise虽然解决了回调地狱但是其是链式调用,会写起来很长也不是很方便后期维护,Async/await就是Promise的升级版。

<script>
    //Async/await
    //步骤1:准备一个返回promise对象的函数
    function asyncTask(){
        return new Promise((resolve,reject)=>{
            let isSuccess=true
            if(isSuccess){
                resolve('任务3的成功处理结果')
            }else{
                reject('任务3的失败处理结果')
            }
        })
    }
    async function main(){
        console.log('任务1')
        const pr1=await asyncTask()
        //这里只等待了一个如果还有继续写
        //const pr2=await asyncTask2()
        console.log(pr1);
        console.log('任务2');
    }
    main()
</script>

3.Proxy对象代理

这个就是表面意思,使用一个对象去代替另一个对象进行一些操作,主要用于框架的封装比如VUE3,vue2中用的就是Object.defineProperty()也是数据渲染的底层。
举例说吧,我们有一个数据存储在对象中,我们想把这个数据渲染到页面很简单,但是我们需要做到当修改数据的时候页面中显示也跟着改变,听起来是不是很熟悉没错就是vue中的双向绑定数据的原理。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="container"></div>
</body>
<script>
    //编写一个对象,把对象的属性显示到页面上,再进行对对象的属性修改时页面跟随变化
    const obj = {
        name: '一号',
        age: 18
    }
    const container = document.getElementById('container');
    // console.log(container);
    // textContent和innerHTML类似
    //我们现在对obj.name修改发现修改后页面并不变化需要从新渲染
    //obj.name = '二号'; //虽然数据变了,但是页面没有变化需要从新渲染
    //container.textContent=obj.name; //从新渲染才可以
    //第二种 使用代理Proxy
    //我们使用代理就可以解决这个问题
    //两个参数 第一个 代理的哪一个对象,第二个一个对象包含函数
    const p1 = new Proxy(obj, {
        get(target, property, receiver) {
            // 数据对象 属性名   Proxy实例
            //获取的时候
            //obj[property] 就是获取对象中的所有属性
            return obj[property]
        },
        set(target, property, value, receiver) {
            // 数据对象 属性名  修改的值 Proxy实例
            //修改的时候
            obj[property] = value
            container.textContent = obj.name;
        }
    })
    console.log(p1.name);
    p1.name='三号'
</script>

</html>

上面的代码就是举得例子,以前自己也不懂双向数据的原理(只会背八股文不知道底层怎么实现的),现在看到proxy恍然大悟。

总结

代码千千万,适合自己最重要。欢迎大家评论指出错误和不足。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值