- 对 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