今天的码农女孩做了关于Promise对象和Symbol的笔记

9 篇文章 0 订阅

Promise对象:

            Promise是异步变成的一种解决方案,传统的解决方案是通过回调函数和事件进行处理

            Promise类似于一个容器,里面保存着某个未来才会结束的事件,解决ajax的地域回调问题,并且支持多个回调函数返回

            特点:

            1.处理异步函数,解决地域回调结束异步函数

            2.Promise对象的状态不受外界影响,是一个异步操作,有三种状态:进行中(pending),已成功(fulfilled)(resolved),已失败(rejected)

            3.状态改变只有两种,一种是从进行中到已成功;一种是从进行中到已失败

            缺点:

            1.Promise对象一旦建立就会立即执行,无法中途取消

            2.如果不设置回调函数,Promise内部抛出错误不会反应到外部

            3.当处于进行中时,无法得知目前进展到哪一个阶段

            属性和方法:

            resolve()执行成功函数的方法

            reject()执行失败函数的方法

            then()成功的回调函数,异步,可以写多个

            catch()失败的回调函数

            all()将多个Promise对象包装成一个新的Promise对象(所有都完成)

            rece()将多个Promise对象包装成一个新的Promise对象(完成一个即可)

            done()处于回调链的尾端,保证抛出任何可能出现的错误

            finally()无论Promise成功还是失败都执行

<script>
         //为了更好的理解promise,先理解链式
         var obj={
            step1:function(){console.log("a");return this;},
            step2:function(){console.log("b");return this;},
            step3:function(){console.log("c");return this;},
            step4:function(){console.log("d");return this;},
         }
         //执行
         obj.step1().step2().step3().step4();//a b c d
         //创建
         var p=new Promise(function(resolve,reject){
             console.log(typeof resolve);//function
             $.ajax({
                 url:'data1.json',
                 success:function(){
                     //调用成功方法
                     resolve();
                }
             });
         })
         p.then(function(){
             console.log("请求成功");
         })
         //all:p的状态有p1,p2,p3共同决定,所有都成功才是成功状态,有一个失败就是失败状态
         var p1=new Promise(function(resolve,reject){
             resolve(1);
         })
         var p2=new Promise(function(resolve,reject){
             resolve(2);
         })
         var p3=new Promise(function(resolve,reject){
             resolve(3);
         })
         var p=Promise.all([p1,p2,p3]);
         p.then(function(value){
             console.log('fulfilled');
             console.log(value);
         },function(value){
             console.log('reject');
             console.log(value)
         })
         //race:只要p1,p2,p3之中有一个实例率先改变状态,p的状态就跟着改变
         var p=Promise.race([p1,p2,p3]);
         p.then(function(value){
             console.log('fulfilled');
             console.log(value);
         },function(value){
             console.log('reject');
             console.log(value)
         })
     </script>

Symbol:也是一种数据类型但是不是字符串,也不是对象,而是一种新的数据类型

        简单理解就是Create a Unique Symbol 创建一个独一无二的值,类似于流水号

        方法:

        1.Symbol() Symbol("描述信息")每次调用都返回一个唯一的Symbol

        2.Symbol.for(string) 从Symbol全局环境中返回相应的Symbol,与上一个方法不同的是Symbol全局环境中先检查给定的key是否已经存在,Symbol.for可以在不同的iframe或service worker中取到同一个值

        区别:Symbol()每次都是新的;Symbol.for(string)只会在第一次创建新的,后续返回第一次的创建

        3.Symbol.keyFor(string)方法返回一个已登记的Symbol类型值的key,未登记的Symbol值,返回undefined

        4.Symbol.iterator指向该对象的默认遍历器方法

        Object.getOwnPropertySymbols返回一个数组,成员是当前对象的所有用作属性名的Symbol值

        场景:Symbol()每次都返回唯一的值,在多人合作时,可以避免属性名重复

<script>
        //创建
        var s1=Symbol();
        var s2=Symbol();
        console.log(s1==s2);//false
        console.log(typeof s1);//symbol
        var s3=Symbol('hello');
        var s4=Symbol('hello');
        console.log(s3==s4);//false
        var s5=Symbol.for('hello');
        var s6=Symbol.for('hello');
        console.log(s5==s6);//true
        //获取字符串
        console.log(Symbol.keyFor(s1));//undefined
        console.log(Symbol.keyFor(s5));//hello
        //遍历
        var arr=[11,12,13];
        var itr=arr[Symbol.iterator]();
        console.log(itr.next());//{value:11,done:false}
        console.log(itr.next());//{value:12,done:false}
        console.log(itr.next());//{value:13,done:false}
        console.log(itr.next());//{value:undefined,done:true}
        //作为属性名
        var mySymbol=Symbol();
        //第一种写法
        a[mySymbol]='hello';
        //第二种写法
        var a={
            [mySymbol]:'hello'
        }
        //内置Symbol值
        var str={};
        str[Symbol.replace]=s=>console.log(s+'!!!');
        'shsxt'.replace(str);//shsxt!!!
    </script>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值