正在想方设法的实现一个Promise/A+。文档看下来,半懂半不懂,于是就去看别人实现的源码。
其他人在实现的时候,是有一个存储函数的数组(then方法中的onFulfilled
函数和onRejected
函数)。
但是Promise规范中,then
方法返回的是一个全新的promise
。
在链式调用时:
promise.then(func1, func2)
.then(func3, func4)
.then(func5, func6)
.then(func7, func8);
每一次then
方法的调用,都会返回一个新的promise
,一个promise
最多就2个方法(一个onFulfilled
和一个onRejected
回调函数),为什么用个数组?
我不是很理解,可能我自己理解错了,请大神解决一下我的疑惑!
之前写过一个简单教程(之所以叫简单,是因为实现很粗糙,肯定没有实现全部Promise
功能),但是在教程里带你一步步通过测试用例把一个Promise
涉及的基本内容实现了。或许对你有帮助手写Promise
因为可以在同一个promise上调用多次then:
对于
var promise = new Promise(...);
promise.then(func1, func2)
promise.then(func3, func4)
promise.then(func5, func6)
promise.then(func7, func8);
...
假设promise执行的是一个异步任务,那么它一定是在将来的某轮循环才会fulfilled或者rejected。那么,在此之前,理论上你可以对它调用多次(几次、几十次、成千上万次)then。
只要它的状态还是pending,那么then方法注册的那些函数都还不会执行。所以你需要有个地方把这些函数先存起来,这么多存哪里啊?当然存数组里。
正好我前段时间也写了一个简单实现作为练习:https://github.com/manxisuo/m-Promise,不过还有部分测试用例没有通过。
数组是用来保存注册的回调用的,至于then返回promise,就是将遍历执行保存的回调函数时把回调函数执行的结果包装进一个新的promise然后传给下一个回调函数。