ES6 Promise原理
一、Promise是什么
A promise is an object that may produce a singe value some time in the future:either a resolved value ,or a reason that it’s not resolved .(e.g.,a network error occurred)
简单说就是一个异步实现的对象,它或者可以解决掉问题,或者可以给予一个未能解决掉这个问题的原因。
二、为什么会有Promise
1、回调地狱 + 异步同步事件调用顺序带来的双重伤害
promise是一个异步函数,并且它能够解决地狱回调。地狱回调简单理解为回调中嵌套回调,当回调的层数太多了就会看起来很混乱。当然如果promise的then太多了,那么我们可以使用Generator或async/await
2、回调事件的分离
then返回的是一个新的promise,它是通过之前的一个promise返回值的不同进行不同方法的调用。即如果上一个promise成功了就执行第一个方法,如果上一个未成功就执行第二个方法。
三、Promise的三种状态
1、resolve
将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
2、reject
将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
3、pending
当前promise状态正在执行,状态只要改变,就会凝固不会再次变化,且方法只能被调用一次。
四、then catch all race
1、then
1、接收两个函数作为参数,分别代表resolve和rejected
2、.then()返回一个新的Promise实例,所以它可以链式调用
3、当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行
4、状态响应函数可以返回新的promise,或其他值,不返回值也可以我们可以认为它返回了一个null;
5、如果返回新的promise,那么下一级.then()会在新的promise状态改变之后执行
6、如果返回其他任何值,则会立即执行下一级.then()
2、catch
catch方法会捕捉catch前到上一个catch中间的,没有设置then的reject方法的reject.
thing1()
.then(()=>{
return thing2();
})
.then(()=>{
return thing3()
})
.catch((err)=>{
return err1()
})
.then(()=>{
return