一、Promise简介
ES6将事件的执行发生异步的时候,分为2个阶段:unsettled 未决阶段和settled 已决阶段,事件总是从未决阶段发展到已决阶段 。
ES6将程序分为三种状态:pending 、resolved、 rejected这三种状态的具体含义如下:
pending:事情处于未决阶段,还没结果
resolved:事情处于已决阶段,已经有结果,而且可以按照正确的逻辑执行下去
rejected事情处于已决阶段,已经有结果,但是无法按照正常逻辑执行
也就是说:
把事情从pending状态推向resolved状态的过程中会传递一些数据,这些数据一般为真实有效数据
把事情从pending状态推向rejected状态的过程中会传递一些数据,这些数据一般为错误信息
因此不同的已决状态也决定了不同的后续处理:
resolved 这是一个正常的已决状态,后续处理表示为 thenable
rejected 这是一个非正常的已决状态,后续处理表示为 catchable
为了更好的理解,以下为promise概念图:
下面举个例子:
故事背景是:张三想邀请同学去吃晚餐
<script>
//封装询问函数 参数txname代表同学姓名
function xunwen(txname){
return new Promise((resolve,reject)=>{
console.log(`张三向${txname}发出晚餐邀请`)
//设置定时器 间隔为一秒
setTimeout(()=>{
//生成一个随机数,若其小于0.2,代表同意 否则拒绝
if(Math.random() < 0.2){
console.log(`${txname}同意了`)
resolve(true)
}else{
console.log(`${txname}拒绝了`)
resolve(false)
}
},1000)
})
}
//存储所有同学是否同意的结果
const proms = [];//日志数组
//代表第一个同意的同学
let hasAgree = false;
for(let i = 1 ; i < 26;i++){
const pro = xunwen(`同学${i}`).then(result => {
if(result){
if(hasAgree){
console.log(`昨日同学${i}对我爱答不理,今日你高攀不起`)
}else{
hasAgree = true;
console.log(`张三很开心${i}同意了`)
}
}
return result;
})
//将结果添加进数组中
proms.push(pro)
}
console.log(proms)
Promise.all(proms).then(result =>{
console.log("日志分析",result)
})
</script>
Promise分析及注意事项:
Promise本质上就是一个构造函数
1.未决阶段 同步代码
通过调用resolve函数将promise从pending状态推向resolved状态
通过调用reject函数将promise从pending状态推向rejected状态
2.resolve和reject只能使用一个,如果使用多个,也只有第一个有用
3.传递的参数只能有一个,表示推向出去的数据