在之前jquery时代,不可避免的试用到AJAX,AJAX请求后台数据的时候,会有三个回调,一个是success, error 还有一个 complete。

一句话描述就是:AJAX发起请求之后,会根据服务器的结果进行这两情况的处理complete方法是必到的。

这样是我初次接触到JS的异步操作。

然后NodeJS时代到了,也带来了回调地狱,一层又一层的callback,写到绝望,后来进一步学习到了Promise,当时各种开源实现,在ES6中得到了规范,并且得到了大多数游览器的支持。

Promise的用法

new Promise(function () {}).then().catch();

Promise的方法

Promise.all(iterable) // 等待所有 promise 得到解决,或等待任何 promise 被拒绝。 如果返回的promise解析,则使用来自已解析的promise的值的聚合数组来解析它,其顺序与多个promises的可迭代中定义的顺序相同。 如果它拒绝,它将被拒绝,原因是迭代中第一个承诺被拒绝。

Promise.allSettled(iterable) // 返回一个 Promise,该 Promise 在所有给定的 Promise 都已解析或拒绝后解析,并带有一组对象,每个对象描述每个 Promise 的结果。

Promise.race(iterable) // 等到任何 Promise 被解决或拒绝。 如果返回的 Promise 解决,则使用解决后的表中第一个 Promise 的值来解决。如果它拒绝了,它就被拒绝了,因为第一个 Promise 被拒绝了。

Promise.reject(reason) // 返回一个新的Promise对象, 拒绝的内容

Promise.resolve(value) // 返回一个新的Promise对象, 解决的结果

Promise的prototype

Promise.prototype.catch() // 对应的 拒绝流程 ,返回一个新的Promise

Promise.prototype.then() // 对应的 解决流程 ,返回一个新的Promise

Promise.prototype.finally() // 最后会执行的流程,返回一个新的Promise

为什么都是返回一个新的Promise

因为Promise有内部有一个流程控制标记STATUS,该值是, Pending Fulfilled Rejected

Promise中的then的回调只会被调用一次,因为Promise的状态只会从Pending变为Fulfilled或者Rejected,不可逆

所以Promise和jquery虽然都有链式操作,但原理是完全不一样的,jquery是每次都返回this对象,而Promise则是返回有一个全新的Promise对象

Promise的执行流程

Promise执行流程和关联图

Leave a Reply

Your email address will not be published. Required fields are marked *