From f910bcb40b0f9ad3435027023a42f72c91a9d8c7 Mon Sep 17 00:00:00 2001 From: "blake.li" Date: Mon, 22 Aug 2022 22:31:29 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 57 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/index.js b/index.js index 59d6c84..bac6246 100644 --- a/index.js +++ b/index.js @@ -1,41 +1,54 @@ -function myPromise(constructor) { - let self = this; - - self.status = "pending" //定义状态改变前的初始状态 +const PENDING = "pending"; +const RESOLVED = "resolved"; +const REJECTED = "rejected"; - self.value = undefined;//定义状态为resolved的时候的状态 +function myPromise(constructor) { + let self = this; - self.reason = undefined;//定义状态为rejected的时候的状态 + self.status = PENDING //定义状态改变前的初始状态 - function resolve(value) { + self.value = undefined;//定义状态为resolved的时候的状态 - // TODO resolve如何改变状态及返回结果 + self.reason = undefined;//定义状态为rejected的时候的状态 - } + function resolve(value) { - function reject(reason) { + // TODO resolve如何改变状态及返回结果 + if (self.status === PENDING) { + self.status = RESOLVED; + self.value = value; + } + } - // TODO reject如何改变状态及返回结果 + function reject(reason) { - } + // TODO reject如何改变状态及返回结果 + if (self.status === PENDING) { + self.status = REJECTED; + self.reason = reason; + } + } - //捕获构造异常 + //捕获构造异常 - try { + try { - constructor(resolve, reject); + constructor(resolve, reject); - } catch (e) { + } catch (e) { - reject(e); + reject(e); - } + } } -myPromise.prototype.then = function (onFullfilled, onRejected) { - - //TODO then如何实现 - +myPromise.prototype.then = function (onFulfilled, onRejected) { + //TODO then如何实现 + if (this.status === RESOLVED) { + onFulfilled(this.value); + } else if (this.status === REJECTED) { + onRejected(this.reason); + } } module.exports = myPromise From a2845ca0b852e0980b8a3ebcecbf43cf678816c2 Mon Sep 17 00:00:00 2001 From: "blake.li" Date: Mon, 22 Aug 2022 22:33:28 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/index.js b/index.js index bac6246..82043de 100644 --- a/index.js +++ b/index.js @@ -5,6 +5,7 @@ const REJECTED = "rejected"; function myPromise(constructor) { let self = this; + self.status = PENDING //定义状态改变前的初始状态 self.value = undefined;//定义状态为resolved的时候的状态 From e822ef491093a7425bb27d048084f06e37590df9 Mon Sep 17 00:00:00 2001 From: "blake.li" Date: Mon, 22 Aug 2022 23:54:22 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E6=9C=BA=E5=88=B6&=E5=A2=9E=E5=8A=A0fulfilled=E3=80=81rejected?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E9=98=9F=E5=88=97=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 80 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 60 insertions(+), 20 deletions(-) diff --git a/index.js b/index.js index 82043de..e5e6549 100644 --- a/index.js +++ b/index.js @@ -1,32 +1,41 @@ const PENDING = "pending"; -const RESOLVED = "resolved"; +const FULFILLED = "fulfilled"; const REJECTED = "rejected"; -function myPromise(constructor) { +function MyPromise(constructor) { let self = this; - self.status = PENDING //定义状态改变前的初始状态 - self.value = undefined;//定义状态为resolved的时候的状态 - self.reason = undefined;//定义状态为rejected的时候的状态 + self.fulfilledQueue = [];//fulfilled 回调执行函数队列 + self.rejectedQueue = [];//rejected 回调执行函数队列 function resolve(value) { - - // TODO resolve如何改变状态及返回结果 + // 状态改变只触发一次(pending-》fulfilled),异步暂时用setTimeout模拟 if (self.status === PENDING) { - self.status = RESOLVED; - self.value = value; + setTimeout(() => { + self.status = FULFILLED; + self.value = value; + + for (let fn of self.fulfilledQueue) { + fn(value); + } + }, 0); } } function reject(reason) { - - // TODO reject如何改变状态及返回结果 + // 状态改变只触发一次(pending-》rejected),异步暂时用setTimeout模拟 if (self.status === PENDING) { - self.status = REJECTED; - self.reason = reason; + setTimeout(() => { + self.status = REJECTED; + self.reason = reason; + + for (let fn of self.rejectedQueue) { + fn(reason); + } + }, 0); } } @@ -44,12 +53,43 @@ function myPromise(constructor) { } -myPromise.prototype.then = function (onFulfilled, onRejected) { - //TODO then如何实现 - if (this.status === RESOLVED) { - onFulfilled(this.value); - } else if (this.status === REJECTED) { - onRejected(this.reason); +MyPromise.prototype.then = function (onFulfilled, onRejected) { + if (this.status === PENDING) { + let fulfilledQueue = this.fulfilledQueue; + let rejectedQueue = this.rejectedQueue; + + return new MyPromise(function (resolve, reject) { + fulfilledQueue.push(function (data) { + try { + let value = onFulfilled(data); + resolve(value); + } catch (e) { + reject(e); + } + }); + + rejectedQueue.push(function (data) { + try { + let value = onRejected(data); + resolve(value); + } catch (e) { + reject(e); + } + }) + }); + } else { + let value = this.value; + let reason = this.reason; + let isFulfilled = this.status === FULFILLED; + return new MyPromise(function (resolve, reject) { + try { + let v = isFulfilled ? onFulfilled(value) : onRejected(reason); + resolve(v); + } catch (e) { + reject(e); + } + }); } } -module.exports = myPromise + +module.exports = MyPromise