1.Promise循环、all()方法的使用
<script>
// 创建一个询问函数
function xunwen(txname){
return new Promise(resolve =>{
setTimeout(() =>{
if(Math.random() < 0.2){
resolve(true);
}else{
resolve(false);
}
},3000)
})
}
// 定义一个变量,但不赋值
let pro;
for(let i = 1;i < 26;i++){
// 将函数循环25遍
if(i == 1){ //第一个同学
pro = xunwen(`同学${i}`)
}
pro = pro.then(result =>{
// 如果后面有人同意了,再碰到上一个,那么控制台打印'已经有人同意了'
if(result == undefined){
console.log("已经有人同意了");
return ;
}else if(result){ //如果结果为true则进入到resolve(true)
console.log(`同学${i}同意了`);
}else{
console.log(`同学${i}拒绝了`);
if(i < 26 - 1){
return xunwen(`同学${i+1}`)
}
}
})
}
</script>
2.原型方法和实例方法创建的Promise比较
<script>
const pro = new Promise((resolve,reject) =>{
resolve(123);
})
const pro2 = Promise.resolve(pro)
// 与上面写法等同
// const pro2 = new Promise(resolve =>{
// resolve(pro)
// })
console.log(pro,pro2);
console.log(pro === pro2)
</script>
3.Promise注意点
1.未决阶段的处理函数是同步的,会立即执行
2.thenable和catchable是异步函数,就算会立即执行,也会加入至任务队列中的微队列中
3.then方法有两个参数分别为thenable和catchable,cathch只可以单独添加catchable函数
4.在未决阶段的处理函数中,如果发生未捕获的错误,会将状态推向rejected状态,并且会被catchable捕获
5.一旦状态推向已决阶段,无法在做任何改变
6.如果前面的promise的后续处理,返回的是一个promise,则返回的promise状态和后续处理返回的promise状态保持一致。