Promise
PS~: Promise是一个构造函数,自己身上有all、reject、resolve等几个方法,原型上有then、catch等几个方法。
Promise 对象用于表示一个异步操作的最终状态(完成或失败),以及其返回的值。
一、Promise有以下三种状态:
pending: 初始状态,既不是成功,也不是失败状态 , ( 等待中 , 或者进行中 , 表示还没有得到结果 )
fulfilled: 意味着操作成功。
rejected: 意味着操作失败。
Promise有两种状态改变的方式,而且状态只能从pending改变为resolved或者rejected,并且不可逆。当状态发生变化,Promise.then绑定的函数就会被调用。
注意:Promise一旦新建就会「立即执行」,无法取消。这也是它的缺点之一。
二、我们使用new来构建一个Promise。
Promise接受一个「函数」作为参数,该函数的两个参数分别是resolve和reject。这两个函数就是就是「回调函数」
resolve函数的作用:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
data为:字符串‘成功’ 或者字符串‘失败’如果异步操作获得了我们想要的结果,那我们将手动调用resolve函数,在then的第一个作为参数的匿名函数中可以获取数据,如果我们得到了错误的结果,调用reject函数,在then函数的第二个作为参数的匿名函数中获取错误处理数据。 这样,一个次完整的Promise调用就结束了。
三、.then()
then()方法执行后会返回一个新的Promise实例。它有两个参数,分别为:Promise从pending变为fulfilled和rejected时的回调函数(第二个参数非必选)。这两个函数都接受Promise对象传出的值(data)作为参数。
语法
onCompleted(必传参数):操作成功完成时要运行的履行处理程序函数。
onRejected(选传参数):操作被拒绝时要运行的错误处理程序函数。
Promise任务链
对于Promise的then()方法,then总是会返回一个Promise实例,因此你可以一直调用then,形如p().then().then().then().then().then().....
1)如果then没有传入处理函数,那么会返回一个继承了上一个处理状态的Promise对象
打印结果2)如果then传入处理函数,那么默认返回一个fulfilled/resolved状态的Promise对象
打印结果3)如果then传入处理函数,通过处理函数显示的return了一个新的Promise,那么返回这个显示的Promise对象
打印结果弊端:不易中途终止后续任务执行
四、.catch()
处理rejected 的情况,与then的第二个参数onRejected相同
打印结果↑ 打印结果↑可以捕获.catch以上的任一错误(前提是:.then中的onRejected函数没有做任何处理)
补充~:
1).catch与.then中的onRejected函数冲突,如果前面.then中出行了onRejected函数,.catch将不会执行。
2).catch执行后会返回一个Promise对象,且状态默认为fulfilled/resolved(与.then相似)
五、.all
多任务处理
打印结果需要等(p1、p2)所有promise执行完,才可以执行then
六、.race
打印结果(p1、p2)只要有一个执行完,就会执行then