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>