在之前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的执行流程
