什么是Promise?
Promise对象用于表示一个异步操作最终的完成或失败及其结果值
主要用于把异步操作最终的成功返回值或者失败原因和其对应的处理逻辑关联起来
一个Promise对象必然处于以下三种状态之一
1. pending-待定:这是promise的初始状态,既没有被兑现没有被拒绝
2. fulfilled-已兑现:操作成功完成后的状态(成功)
3. rejected-已拒绝:操作失败后的状态(失败)
这三种状态只包含两种转化路径,而且转化路径是不可逆的,已经确定的状态(fulfilled/rejected)无法转回初始状态(pending)
pending -> fulfilled
pending -> rejected
方法: Promise.prototype.then()
Promise对象含有then方法,then()调用后返回一个Promise对象,意味着实例化后的Promise对象可以进行链式调用,而且这个then()方法可以接收两个函数,第一个是处理成功后的回调函数,第二个是处理错误结果的回调函数。
如下代码:随机生成一个0-1(不包含1)的随机数,如果>=0.5则在三秒后调用resolve方法将当前promise的状态更改为fulfilled,如果<0.5则在三秒后调用reject方法将当前promise的状态更改为rejected,如果最终状态为fulfilled(成功)则执行then方法的第一个参数函数,如果最终状态是rejected(失败)则执行then方法的第二个参数函数
上边有提到then方法调用后是会返回一个Promise对象的,那么返回的这个promise对象是个什么状态呢,编写代码来看一下
这里可以看到无论第一个promise的状态是成功还是失败,第二个(调用then方法后返回的)promise的状态始终是成功的
那么这里可以总结第一条:
如果then方法没有明确指定的resolve(data)/reject(data)/return data时,那么返回的新Promise就是接收状态,可以一层一层地往下传递。
那是不是then方法返回的promise始终是成功状态呢,我们来看看其他情况
这里可以看到我return 0相当于return false但是它还是成功状态
其实这里你不管return什么它都会是成功状态的
由此总结出第二条:
如果then方法中返回了一个参数值,那么返回的Promise将会变成功状态。
接下来试试throw 抛出异常会发生什么
可以看到我们在then方法中抛出异常使得then方法返回的promise状态变成了失败状态
我们可以总结第三条:
如果then方法中抛出了一个异常,那么返回的Promise将会变成失败状态。
接下来我们再开试试在then方法中返回新的promise对象会发生什么呢
这里可以总结第四条:
如果then方法明确返回一个promise对象,那么最终状态就是这个被明确返回的promise对象的状态
那么实际上会有以下四种情况
如果then方法没有返回值时,那么返回的新Promise就是成功状态
如果then方法中返回了一个值,那么返回的Promise将会变成功状态
3. 如果then方法中抛出了一个异常,那么返回的Promise将会变成失败状态
- 如果then方法明确返回一个promise对象,那么最终状态就是这个被明确返回的promise对象的状态
总结以上四点,其实就是除非Promise.then()方法内部抛出异常或者是返回一个明确置为rejected状态的promise,否则它返回的Promise的状态都是fulfilled态,即完成态,并且它的状态不受它的上一级的状态的影响。
方法: Promise.prototype.catch()
catch方法和then方法一样,都会返回一个新的Promise对象(状态和then方法一致,会有上述四种情况),它主要用于捕获异步操作时出现的异常。因此,我们通常省略then()方法的第二个参数,把错误处理控制权转交给其后面的catch方法
方法: Promise.all()
Promise.all()接收一个参数,它必须是可以迭代的,比如数组。
它通常用来处理一些并发的异步操作,即它们的结果互不干扰,但是又需要异步执行。它最终只有两种状态:成功或者失败。
它的状态受参数内各个值的状态影响,即里面状态全部为fulfilled时,它才会变成fulfilled,否则变成rejected。
成功调用后返回一个数组,数组的值是有序的,即按照传入参数的数组的值操作后返回的结果。如下:
方法: Promise.race()
Promise.race()和Promise.all()类似,都接收一个可以迭代的参数,但是不同之处是Promise.race()的状态变化不是全部受参数内的状态影响,一旦参数内有一个值的状态发生的改变,那么该Promise的状态就是改变的状态。大概意思就是谁先改变了状态,那么该promise的状态就是什么状态