- 对 promise 的实现感兴趣的可以移步我上一篇博客手撸一个符合 PromiseA+规范的 Promise
catch
catch其实就是then的第二个参数
1 | |
resolve
- 返回一个以给定值解析后的
Promise对象 - 如果这个值是一个
promise,那么将返回这个promise - 如果这个值是
thenable(即带有then方法),返回的promise会“跟随”这个thenable的对象,采用它的最终状态
1 | |
reject
1 | |
finally
- 如果返回一个 promise 会等待这个 promise 也执行完毕。
- 如果返回的是成功的 promise,会采用上一次的结果;
- 如果返回的是失败的 promise,会用这个失败的结果,传到 catch 中。
1 | |
race
race接受一个数组,只要有一个请求完成,就返回。将数组的每一项用MyPromise.resolve包裹下,处理thenable
1 | |
all
all跟race差不多,接受一个数组,但是要等每一项都返回,并且要保证返回结果和入参数组下标一一对应。如果有一项失败就直接reject。
1 | |
完整代码
1 | |
static表示class的静态方法,能够用类直接调用,如MyPromise.resolve
几个问题
为什么promise resolve了一个value, 最后输出的value值确是undefined
1 | |
答: 因为现在这种写法, 相当于在.then里return undefined, 所以最后的value是undefined. 如果显式return一个值, 就不是undefined了;比如return value.
.then返回的是一个新Promise, 那么原来promise实现的时候, 用数组来存回调函数有什么意义?
这个问题提出的时候, 应该是有一个假定条件, 就是链式调用的时候.
这个时候, 每一个.then返回的都是一个新promise, 所以每次回调数组FULFILLED_CALLBACK_LIST都是空数组.
针对这种情况, 确实用数组来存储回调没意义, 完全可以就用一个变量来存储。
1 | |
但是还有一种promise使用的方式, 这种情况下, promise实例是同一个, 数组的存在就有了意义
1 | |
为什么我在catch的回调里, 打印promise, 显示状态是pending
1 | |
- catch 函数会返回一个新的promise, 而test就是这个新promise
- catch 的回调里, 打印promise的时候, 整个回调还并没有执行完成(所以此时的状态是pending), 只有当整个回调完成了, 才会更改状态
- catch 的回调函数, 如果成功执行完成了, 会改变这个新Promise的状态为fulfilled