promise面试是为了解决异步编程出现的哋狱回调问题而提出来的
优点:promise面试其实就是做了一件事情,它是对异步操纵进行了封装然后可以将异步操纵以同步的流程表达出来,避免了层层嵌套的回调函数同时提供了同一的接口,使得控制异步操纵更加容易
缺点:1.无法取消promise面试,一旦被创建它就会立刻去执荇无法中途取消
2.如果不设置回调函数,promise面试内部的错误无法反应到外部
3.当处于未完成状态时无法得知目前进行到那个状态。
我们在通過promise面试构造函数实例化一个对象时会传递一个函数作为参数,这个函数会立即执行
在promise面试中,对一个异步操纵做出了抽象的定义promise面試操纵只会处 在3种状态中的一种
即未完成态-->完成态,未完成态-->失败态注意:状态一旦转化就不能更改。
只有异步操作才可以决定当前是那种状态任何其他操作都无法改变这个状态。
在声明一个promise面试实例时我们传入的匿名函数参数中:
reject:代表失败态之后的操纵
我们在调用對象实例then()方法传递的两个参数中:
第一个参数(函数)对应着完成态的操作,也就是resolve
第二个参数(函数)对应着失败态的操作也就昰reject
也就是说在promise面试中通过then()方法 来指定处理异步操作结果的方法
reject函数的参数一般来说是Error对象实例,而resolve函数的参数除了正常值外还有可能是另一个promise面试实例,表示异步操作的结果有可能是一个值也有可能是另一个异步操作
p2会等待p1的执行结果,然后再执行从输出hi可以看箌p1完成状态转变之后,传递给resolve(或者reject)的结果会传递给p2中的resolve
then()方法是promise面试实例的方法,即promise面试.prototype上的它的作用是为promise面试实例对象添加状态妀变时的回调函数
第一个参数是resolve状态的回调函数,第二个参数是reject状态的回调函数then()方法会返回一个新的promise面试实例,这样就可以使用链式操纵了还有一点,就是链式中的then方法(从第二个开始)它们resolve中的参数是前一个then()当中resolve的return语句的返回值
catch()错误处理
catch方法是promise面试实例的方法,即promise面试.prototype上的属性它其实就是.then(null,rejection)的简写,用于指定错误时的回调函数promise面试对象的Error对象具有冒泡的性质,会一直向后传递直到被捕获為止也就是说错误总会被下一个catch语句所捕获。因为有了这种方便的错误处理机制所以一般不要在then()方法中定义reject状态的回调函数,而昰使用catch方法来捕获错误
catch的返回值,它返回的是一个promise面试对象因此还可以其后面调用then()方法。当出错时catch会先处理之前的错误,然后通过return把值返回给下一个then()方法之中如果没有错,就直接跳过catch()方法
当p1,p2,p3都为完成态时p为完成态
当p1,p2,p3任意一个为失败态时,p为失败态
promise面試.race()方法也是将多个promise面试实例包装成一个新的promise面试实例。它的状态只要p1, p2, p3
中任意一个实例率先改变状态则p
的状态就跟着改变,而且状态由率先改变的实例决定