function res(pre) { let resFn, rejFn, fns = this.fns; while (! resFn && fns.length > 0) { [resFn, rejFn] = fns.shift(); } if (resFn && pre && pre.status === "pending") { return pre.then((ret) => exec.call(this, resFn, ret), (ret) => rej.call(this, rejFn, ret)); } resFn ? exec.call(this, resFn, pre) : this.status = "resolved"; } function rej(pre,fn) { while (! fn && fns.length > 0) { fn = fns.shift()[1]; } fn ? exec.call(this, fn, pre) : this.status = "rejected"; } function exec(fn, pre) { this.value = pre; try { res.call(this, fn(pre)); } catch (e) { rej.call(this, e); } } function Promise(fn) { this.status = "pending"; this.fns=[]; setTimeout(() => fn((ret) => res.call(this, ret), (ret) => rej.call(this, ret))); return this; } Promise.prototype.then=function (resFn, rejFn) { let status = this.status; if (status ! == "pending") { exec.call(this, status === "resolved" ? resFn : rejFn, this.value); } else { this.fns.push([resFn,rejFn]); } return this; }; Promise.prototype.catch=function(fn){ this.then(undefined,fn); };Copy the code
Leave the rest of the API to the big guys…