diff --git a/.github/workflows/node1.js.yml b/.github/workflows/node1.js.yml new file mode 100644 index 0000000..05f5588 --- /dev/null +++ b/.github/workflows/node1.js.yml @@ -0,0 +1,31 @@ +# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [12.x, 14.x, 16.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run build --if-present + - run: npm test diff --git a/index.js b/index.js index 59d6c84..0792e83 100644 --- a/index.js +++ b/index.js @@ -1,41 +1,86 @@ -function myPromise(constructor) { +function myPromise(executor) { + // 定义promise的状态 let self = this; + self.status = "pendding"; + self.value = null; // 成功之后 返回数据 + self.reason = null; // 失败之后返回原因 - self.status = "pending" //定义状态改变前的初始状态 - - self.value = undefined;//定义状态为resolved的时候的状态 - - self.reason = undefined;//定义状态为rejected的时候的状态 + // 这个是 发布订阅 + self.fulfilledCallbackList = []; + self.rejectCallbackList = []; + // 定义完成时的方法 function resolve(value) { - - // TODO resolve如何改变状态及返回结果 - + if (self.status == "pendding") { + self.status = "fulfilled"; + self.value = value; + self.fulfilledCallbackList.forEach(item => item(value)); + } } - - function reject(reason) { - - // TODO reject如何改变状态及返回结果 - + // 这个是 异常时候的方法 + function reject(err) { + if (self.status == "pendding") { + self.status = "rejected"; + self.reason = err; + self.rejectCallbackList.forEach(item => item(err)); + } } - //捕获构造异常 - + // 立即执行 executor里面的方法 try { + executor(resolve, reject); + } catch (err) { + reject(err.message); + } +} - constructor(resolve, reject); +// 这个是 原型链上面的 then 方法 +myPromise.prototype.then = function (onFulfilled, onRejected) { + // 这里 还要 判断一下 传入进来 是不是一个方法 + onFulfilled = typeof onFulfilled == 'function' ? onFulfilled : function (data) { resolve(data) }; + onRejected = typeof onRejected == 'function' ? onRejected : function (err) { throw err; } - } catch (e) { + let self = this; - reject(e); + // 这里是 then 里面的回调部分 + if (self.status == "fulfilled") { + // 链式调用 就是 直接返回一个 Promise + return new myPromise((resolve, reject) => { + try { + let x = onFulfilled(self.value); + x instanceof myPromise ? x.then(resolve, reject) : resolve(x); + } catch (err) { + reject(err); + } + + }); + } + // 这个是 失败的状态 + if (self.status == "rejected") { + return new myPromise((resolve, reject) => { + try { + let x = onRejected(self.reason); + x instanceof myPromise ? x.then(resolve, reject) : resolve(x); + } catch (err) { + reject(err); + } + }); } + // 这个是 pendding的状态 + if (self.status == "pendding") { + return new myPromise((resolve, reject) => { + self.fulfilledCallbackList.push(() => { + let x = onFulfilled(self.value); + x instanceof myPromise ? x.then(resolve, reject) : resolve(x); + }); + self.rejectCallbackList.push(() => { + let x = onRejected(self.reason); + x instanceof myPromise ? x.then(resolve, reject) : resolve(x); + }); + }); + } } -myPromise.prototype.then = function (onFullfilled, onRejected) { - - //TODO then如何实现 - -} module.exports = myPromise