diff --git a/index.js b/index.js index 59d6c84..8f35ae4 100644 --- a/index.js +++ b/index.js @@ -7,18 +7,48 @@ function myPromise(constructor) { self.reason = undefined;//定义状态为rejected的时候的状态 + self.callbacks = []; // 存储then中传入的参数 + function resolve(value) { // TODO resolve如何改变状态及返回结果 + self.status = "resolved"; + self.value = value; + + self.callbacks.forEach(cb=>self._handler(cb)) + return this; } function reject(reason) { // TODO reject如何改变状态及返回结果 + self.status = "rejected"; + self.reason = reason; + + self.callbacks.forEach(cb=>self._handler(cb)) + return this; } + self._handler = function(cb) { + const {onFullfilled, onRejected, nextResolve, nextReject} = cb + if(self.status === "pending") { + this.callbacks.push(cb); + return; + } + try { + if(self.status === "resolved") { + self.value = onFullfilled(self.value) + } else if (self.status === "rejected") { + self.value = onRejected(self.reason); + } + nextResolve(self.value) + } catch(err) { + nextReject(err) + } + } + //捕获构造异常 try { @@ -35,7 +65,14 @@ function myPromise(constructor) { myPromise.prototype.then = function (onFullfilled, onRejected) { - //TODO then如何实现 - + return new myPromise((nextResolve, nextReject) => { + this._handler({ + onFullfilled, + onRejected, + nextResolve, + nextReject + }) + }) } + module.exports = myPromise diff --git a/index.test.js b/index.test.js index cbb1027..5a64497 100644 --- a/index.test.js +++ b/index.test.js @@ -6,4 +6,14 @@ test('测试primose的then是否成功', () => { return p.then(data => { expect(data).toBe('isOk'); }); -}); \ No newline at end of file +}); + +test('测试primose的then的鏈式調用是否成功', () => { + expect.assertions(1); + return p.then(() => { + return "isfail" + }).then(data=>{ + expect(data).toBe('isfail'); + // throw new Error("reject"); + }) +});