❓有任何疑问都可以私信我解答
⚡️仓库地址:https://gitee.com/super_li_yu/jsexamdemo/tree/master/JavaScript/promise
😛建议关注,持续更新。
✒️主要内容:Promise
Promise是一门是在ES6里提出的新技术,是JS在异步编程的一种解决方案,可以支持链式调用,可以解决地狱问题指定回调的问题更加灵活。
Promise成功会调用resovle中,失败会调用reject。then里面会包裹两个函数体,第一个函数体放成功的逻辑,第二个函数体放失败的逻辑。
实例对象中的另外一个属性:[PromiseResult]
保存着对象[成功/失败]的结果

Promise构造函数:Promise(excutor){}
(resolve,reject)=>{}value=>{}reson=>{}说明
excutor会在Promise内部
立即同步调用,异步操作在执行器中执行。
Promise.prototype.then方法:(onResolved,onRejected)=>{}
说明
指定用于得到成功的value的成功回调和用于得到失败的reson的失败回调返回一个新的Promise对象
Promise.prototype.catch方法:(onRejected)=>{}
Promise.resolve方法:(value)=>{}
说明
返回一个成功/失败的Promise对象
1.如果传入的的参数为非promise类型的对象,则返回的结果为成功promise对象
2.如果传入的参数为promise对象,则参数的结果决定了resolve的结果
Promise.reject方法:(reson)=>{}
说明
返回一个失败的Promise对象
无论你传入什么数值,都是失败的对象
Promise.all方法:(Promise)=>{}
说明
返回一个新的Promise,
只有所有的Promise都成功才成功,只要有一个失败就直接失败
如果都成功,就返回一个数组,里面是返回成功的对象.
如果有一个失败,就返回该失败的结果.
Promise.race方法:(Promises)=>{}
说明
返回一个新的Promise,
第一个完成的Promise的结果状态就是最终的结果状态

then方法先执行还是改变状态先执行.
这块应用场景最多的还是在链式调用的最后,使用.catch来捕捉错误.
中间出现的任何错误,都可以到最后进行捕获
let p = new Promise((resolve, reject) => {
setTimeout(() => {
// resolve('ok');
reject('出错了')
}, 1000)
})
p.then(value => {
console.log(111);
}).then(value => {
console.log(222); //success
}).then(value => {
console.log(333); //undefined
}).catch(reson => {
console.warn(reson);
})
只要我们给消息队列中想要中断的位置添加一个状态为pedding(进行中)的Promise就可以了。
let p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('ok')
}, 1000)
});
p.then(value => {
console.log(111)
//返回一个padding状态的promise的回调对象
return new Promise(() => { })
}).then(value => {
console.log(222);
}).then(value => {
console.log(333);
}).catch(reson => {
console.log(reson);
})
这样控制台只会输出
111,后面的222,333,就不会再输出了。
这块内容在代码仓库里哦
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>抽奖系统title>
head>
<body>
<button id="btn">点击抽奖button>
body>
html>
<script>
//生成随机函数
function rand(m,n){
return Math.ceil(Math.random() * (n-m+1)) + m-1;
}
/**
* 点击按钮,2s后显示是否中奖(30%概率)
* 中奖弹出
* 未中奖弹出 再次努力
*/
//原生js实现
// const btn = document.querySelector("#btn");
// btn.addEventListener('click',function(){
// //定时器
// setTimeout(()=>{
// //30% 1-100 1-30
// let n = rand(1,100)
// if(n <= 30){
// alert('中奖')
// }else{
// alert('没中奖')
// }
// },1000)
// })
// Promise实现
/**
* resolve 解决 函数类型的数据
* rejet 拒绝 函数类型的数据
*/
const btn = document.querySelector("#btn");
btn.addEventListener('click',function(){
const p = new Promise((resove,reject)=>{
setTimeout(()=>{
//30% 1-100 1-30
let n = rand(1,100)
if(n <= 30){
resove(n); //调用完成后,可以将Promise对象的状态设置为成功
}else{
reject(n); //调用完成后,可以将Promise对象的状态设置为失败
}
},1000)
})
//调用then方法
p.then((n)=>{
alert(`中奖号为${n}`);
},(n)=>{
alert(`失败,号码为${n}`);
})
});
script>
其他源码看仓库即可