本文已参与「新人创作礼」活动,一起开启掘金创作之路
1.Promise是什么?
1. 抽象的说是js中进行异步编程的新的解决方案(旧的是谁?-->纯回调)
2.具体描述:
(1)从语法上来说:Promise是一个构造函数
(2)从功能上来说:Promise对象用来封装一个异步操作并可以获取其结果
2.Promise状态
1.pendding变为fulfilled
2.pendding变为rejected
说明:只有这两种,且一个promise对象只能改变一次
无论变为成功或者失败,都会有一个结果数据
成功的结果数据一般成为value,失败的结果数据一般成为reason
3.Promise的基本使用
//创建一个promsie对象
const p = new Promise((resolve,reject)=>{ //new promise时会有一个执行器executor
//执行异步操作
setTimeout(()=>{
const time = Date.now() //如果当前时间是偶数就代表成功,否则就是失败
if(time%2 == 0){
resolve('成功的数据,time=' + time)
}else{
reject('失败的数据,time=' + time)
}
},1000)
})
p.then(
value => { //接收得到成功的value数据
console.log('成功的onResolved',value);
},
reason => { //接收得到失败的reason数据
console.log('失败的onRejected',reason);
}
)
4.为什么要用Promise?
1.指定回调函数的方式更加灵活:
旧的:必须在启动异步任务前指定回调函数
promise:回调函数一般在启动异步任务之后(也可在异步任务完成之后)
2. 支持链式调用,可以解决回调地域问题
什么是回调地狱?回调函数嵌套调用,外部回调函数异步执行的结果
是嵌套的回调函数执行的条件
回调地狱的缺点:不便于阅读、不便于异常处理
解决方案:promise链式调用(还有回调函数)
终极解决方案:async/await
2.1回调地狱(纯回调产生的)
doSomething(function(result){
doSomethingElse(result,function(newResult){
doThirdThing(newResult,function(finaResult){
console.log('打印结果: + finaResult)
},failureCallback)
},failureCallback)
},failureCallback)
异常处理每个都需要分别去做
2.2使用promise的链式调用解决回调地狱
doSomething().then(function(result){
return doSomethingElse(result) //此处会返回一个新的promise
})
.then(function(newResult){
return doThThing(newResult)
})
.then(function(finaResult){
console.log('打印结果:' + finaResult)
})
.catch(failureCallback)
5.promise 语法
1.Promise.all()
//返回一个新的promise对象,只有所有的都成功才叫成功,只要有一个失败了就直接失败
2.Promise.allSettled()
3.Promise.any()
4.Promise.prototype.catch()
5.Promise.prototype.finally()
6.Promise.race()
//返回一个新的promise对象,第一个完成的promise结果状态就是最终的状态
7.Promise.reject() //返回成功的promise对象
8.Promise.resolve() //返回失败的promise对象
9.Promise.prototype.then()
6. promise的几个关键问题
1. 如何改变promise的状态
(1)调用resolve(value):如果当前是pendding就会变为resolved
(2)调用reject(reason):如果当前是pendding就会变为rejected
(3)抛出异常:如果当前是pendding就会变为rejected