理解
抽象表达
Promise是JS中进行异步编程的新的解决方案。
注:旧的解决方案:纯回调的形式
具体表达
- 从语法上来讲:Promise是一个构造函数
- 从功能上来讲:Promise对象用来封装一个异步操作并可以获取其结果。
Promise的状态改变
- pending变为
resolved
- pending变为
rejected
注意:
只有这两种状况,且一个Promise对象只能改变一次
无论变为成功还是失败,都只有一个数据
成功的结果数据一般为value,失败的结果数据一般为reason
Promise的基本流程
<script>
//1.创建新的promise对象
const p = new Promise((resolve,reject) => {
//执行器函数(执行异步操作)------>同步回调
//2.执行异步任务
setTimeout(() => {//------>异步回调
const curTime = Date.now();
if(curTime % 2 == 0){
//3.1 如果成功,执行resolve(value)
resolve('异步操作成功:当前时间为偶数:' + curTime);
}else{
//3.2如果失败,执行reject(reason)
reject('异步操作失败:当前时间为奇数:' + curTime);
}
},1000)
});
//4.接收数据
p.then(
//4.1 得到成功的数据 onResolved()
value => {
console.log('成功:' + value);
},
//4.2 得到失败的数据 onRejected()
reason => {
console.log('失败:' + reason);
}
)
</script>
为什么要用promise
- 在纯回调的形式中必须是:先指定好处理成功的回调和失败的回调函数,接着才可以 启动异步任务
如果是先启动异步任务,接着在指定回调,此时的回调已经得不到数据,因为异步任务已经完成了
- promise指定回调函数的方式更加灵活:主要灵活体现在时间的问题上,纯回调的形式回调函数的指定必须是在 启动异步任务之前指定; 而promise可以是启动异步任务之后,甚至是启动的异步任务完成之后进行回调的指定
注:一旦创建好promise对象
const p = new Promise((resolve,reject) => {...});
此时异步任务已经启动,可能正在执行异步任务的过程中,还没有完成操作。(异步任务的启动到完成是需要花费一定的时间的)—》一个promise对象对应一个异步任务
- promise支持 链式调用 ,可以解决回调地狱问题
什么是回调地狱???
答案:首先回调地狱涉及到多个异步操作,而且它们是连续串联执行的(也就是第二个异步任务是以第一个异步任务的结果为条件的,第三个异步任务是以第二个异步任务的结果为条件)
回调地狱的缺点???
答案:不便于阅读,不便于异常处理
解决方案???
答案:promise链式调用()
终极解决方案???
答案:async/await
回调地狱:
promise解决回调地狱:
注: 由于promise中仍然存在回调函数,因此并不是解决回调地狱的终极解决方案
async/await解决回调地狱终极解决方案: