ES6Promise
实现一个符合 Promise/A+ 规范的ES6写法的Promise,并实现 resolve、reject、all、race等静态方法。
Constructor(构造器)
- 作用:从构造函数
Promise来创建一个新建新promise对象,可以使用new来调用Promise的构造器来进行实例化 - 接收一个回调函数
executor - 状态
- 如果是
pending状态,则promise:- 可以转换到
fulfilled或rejected状态。
- 可以转换到
- 如果是
fulfilled状态,则promise:- 不能转换成任何其它状态。
- 必须有一个值,且这个值不能被改变。
- 如果是
rejected状态,则promise可以:- 不能转换成任何其它状态。
- 如果是
- resolve
promise的状态是fulfilled异常是的处理函数- 接收
value参数- 如果是
promise,执行then。 - 如果不是
promise,把value做为参数传给onFulfilledCallbacks里的每个函数。
- 如果是
- reject
promise的状态是rejected异常是的处理函数- 接收
reason参数,把reason做为参数传给onRejectedCallbacks里的每个函数。
- 执行
executor,如果有异常,抛给reject
constructor(executor) {
if (typeof executor !== 'function') {
throw new TypeError('Promise resolver ' + executor + ' is not a function');
}
let self = this
this.status = 'pending'
this.value = undefined
this.reason = undefined
this.onFulfilledCallbacks = []
this.onRejectedCallbacks = []
function resolve (value) {
if (value instanceof ES6Promise) {
return value.then(resolve, reject);
}
if (self.status === 'pending') {
self.value = value;
self.status = 'fulfilled';
self.onFulfilledCallbacks.forEach(item => item(value));
}
}
function reject(reason) {
if (self.status === 'pending') {
self.reason = reason;
self.status = 'rejected';
self.onRejectedCallbacks.forEach(item => item(reason));
}
}
try {
executor(resolve, reject)
} catch (e) {
reject(e)
}
}
Instance Method(内置方法)
-
resolvePromise(私有方法)
-
Promise解析过程 是以一个promise和一个值做为参数的抽象过程,可表示为[[Resolve]](promise, x) -
如果
promise和x指向相同的值, 使用TypeError做为原因将promise拒绝。 -
如果
x是一个promise, 采用其状态:- 如果
x是pending状态,promise必须保持pending走到xfulfilled或rejected. - 如果
x是fulfilled状态,将x的值用于fulfillpromise. - 如果
x是rejected状态, 将x的原因用于reject promise.
- 如果
-
如果
x是一个对象或一个函数:- 将
then赋为x.then. - 如果在取
x.then值时抛出了异常,则以这个异常做为原因将promise拒绝。 - 如果
then是一个函数, 以x为this调用then函数, 且第一个参数是resolvePromise,第二个参数是rejectPromise,且:- 当
resolvePromise被以y为参数调用, 执行[[Resolve]](promise, y). - 当
rejectPromise被以r为参数调用, 则以r为原因将promise拒绝。 - 如果
resolvePromise和rejectPromise都被调用了,或者被调用了多次,则只第一次有效,后面的忽略。 - 如果在调用
then时抛出了异常,则: * 如果resolvePromise或rejectPromise已经被调用了,则忽略它。 * 否则, 以e为reason将promise拒绝。
- 当
- 如果
then不是一个函数,则 以x为值fulfill promise。
- 将
-
如果
x不是对象也不是函数,则以x为值fulfill promise。
-
//利用Symbol值的唯一性,将私有方法的名字命名为一个Symbol值
const _resolvePromise = Symbol('resolvePromise')
[_resolvePromise](promise2, x, resolve, reject) {
let self = this
if (promise2 === x) {
return reject(new TypeError('循环引用'))
}
let then, called
if (x != null && ((typeof x == 'object' || typeof x == 'function'))) {
try {
then = x.then
if (typeof then == 'function') {
then.call(x, function (y) {
if (called)return
called = true
self[_resolvePromise](promise2, y, resolve, reject)
}, function (r) {
if (called)return
called = true
reject(r)
});
} else {
resolve(x)
}
} catch (e) {
if (called)return
called = true
reject(e)
}
} else {
resolve(x)
}
}
==以下未完待填坑==
-
then
-
catch
Static Method(静态方法)
-
all
-
race
-
resolve
-
reject
参考资料
- https://segmentfault.com/a/1190000002452115
- http://liubin.org/promises-book/