promise是js中进行异步编程新的解决方案,具体讲语法上讲是一个构造函数,功能上讲是用来封装异步操作并且获得其结果
promise的状态:初始的状态是pending(未确定的)可能发展为一下两种结果:1:resolved(成功的状态)2:rejected(失败的状态)resolved的结果返回数据一般为value,而rejecte的的结果返回数据为reason;
先进行new Promise()pending状态
//1.创建一个新的promise对象
const p=new Promise((resolve,reject)=>{
console.log('执行excutor')
//执行器函数,同步回调
//执行异步操作任务
setTimeout(()=>{
//3.1成功调用resolve(value)
//3.2失败了,调用reject(reason)
const time=Date.now()
if(time%2==0){
resolve('成功的数据')
}else{
reject('失败的数据')
}
},1000)
})
console.log('new Promise之后')
//执行结果为 执行excutor,new Promise之后 ,因为执行器函数,同步回调
p.then(
value=>{
//接收得到成功的value数据 onResolved
console.log('成功的回调',value)
},
reason=>{
//接收得到失败的reason数据 onReject
console.log('失败的回调',reason)
}
)
promise与普通的纯回调函数的区别:
普通的纯回调函数,需要先指定回调函数,然后才启动异步回调(指定回调函数必须在启动异步任务前)
//1:更加灵活promise 可以先启动异步任务,后面指定回调函数(指定回调函数一般在启动异步任务后,但是有了结果后再指定回调函数也可以)
!promise中1秒后有了结果,3秒后才指定回调
setTimeout(()=>{
p.then(
value=>{
//接收得到成功的value数据 onResolved
console.log('成功的回调',value)
},
reason=>{
//接收得到失败的reason数据 onReject
console.log('失败的回调',reason)
}
)
},3000)
//2:支持链式语法,可以解决地狱回调问题(回调函数嵌套使用不便于阅读和理解)
使用Promise解决地狱回调还会有回调函数,终极解决地狱回调问题使用async、awiat
doSomething.then(function(result){
return doSomethingSecond(result)
}).then(function (newRequest) {
return doSomethingtThird(newRequest)
}).then(function (finalRequest) {
console.log(finalRequest)
}).catch(finalCallback)
async function request(){
try{
const request =await doSomething()
const newRequest =await doSomethingSecond(request)
const finalRequest =await doSomethingtThird(newRequest)
console.log(finalRequest)
}catch(error){
finalCallback(error)
}
}