「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」。
1、promise概述?
1-1、什么是promise
Promise 是一个对象,它代表了一个异步操作的最终完成或者失败 ------MDN
Promise代表了未来将要发生的事件,用来传递异步操作的消息
-
抽象表达:Promise是JS中进行异步编程的新的解决方案(旧:纯回调)
-
具体表达:
语法上:Promise是一个构造函数
功能上:Promise对象用来封装一个异步操作并或取其结果
1-2、promise的状态及状态改变
promise的三种状态
-
待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
-
已兑现(fulfilled): 意味着操作成功完成。
-
已拒绝(rejected): 意味着操作失败。 promise的状态改变:
-
pending -> resolve方法 -> fulfilled
-
pending -> reject方法 -> rejected
注意:只有这两种状态改变,且一个Promise对象的状态只能改变一次,一旦状态改变,就不会再变
2、promise的基本运行流程
3、promise的基本使用
// 1、创建Promise对象
const p=new Promise((resolve,reject)=>{ //执行器函数 同步回调
// 2、执行异步操作任务
setTimeout(()=>{
const time=Date.now()
if(time%2==0){ //当前时间偶数-成功
// 成功时调用resolve()
resolve('成功的数据,time='+time)
}else{
// 失败时调用reject()
reject('失败的数据,time='+time) }
},1000)
})
p.then(
value=>{ //接收成功时得到的value数据onResolved()
console.log(value)
},
reason=>{ //接收失败时得到的reason数据 onRejected()
console.log(reason)
}
)
//异步任务结束后在指定回调函数,回调函数同样可以得到结果
setTimeout(()=>{
p.then(
value=>{ //接收成功时得到的value数据 onResolved()
console.log(value)
},
reason=>{ //接收失败时得到的reason数据 onRejected()
console.log(reason)
}
)
},2000)
4、为什么要用promise?
4-1、使用Promise的优点
-
指定回调函数方式更加灵活(指定时间不受限制)
纯回调:必须在启动异步任务前指定
promise:启动异步任务---》返回Promise对象---》给promise绑定回调函数(甚至可以在异步任务结束后绑定回调函数)
// 成功的回调函数
function successCallback(result){
console.log('创建成功:'+result)
}
// 失败的回调函数
function failCallback(error){
console.log('创建失败:'+error)
}
// 使用纯回调函数---必须在异步任务启动前指定回调函数
createFileAsync(fileSettings,successCallback,failCallback)
// 使用Promise
const promise=createFileAsync(fileSettings)
setTimeout(()=>{
promise.then(successCallback,failCallback)
},3000)
-
支持链式调用,可解决回调地狱问题
回调地狱:回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数执行的条件
回调地狱缺点:不便于阅读/不便于异常处理
// 回调地狱
doSomething(function(result){
doSomethingElse(result,function(newResult){
doThirdThing(newResult,function(finalResult){
console.log('Got the final result:',finalResult)
},failCallback)
},failCallback)
},failCallback)
解决方案:promise链式调用
// 使用promise的链式调用解决地狱回调
doSomething()
.then(function(result){
return doSomethingElse(result)
})
.then(function(newResult){
return doThirdThing(newResult)
})
.then(function(finalResult){
console.log('Got the final result:',finalResult)
})
.catch(failCallback) //异常传透,三个函数的错误都传到failCallback
最终解决方案:async/await
// async/await:回调地狱终极解决方案
async function request(){
try{
const result = await doSomething()
const newResult = await doSomethingElse(result)
const finalResult = await doThirdThing(newResult)
console.log('Got the final result:',finalResult)
}catch(error){
failCallback(error)
}
}
4-2、promise的缺点
- 无法取消 Promise,一旦新建它就会立即执行,无法中途取消。
- 如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。
- 当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。