es6 promise簡易實現
阿新 • • 發佈:2020-08-05
function MyPromise(fn) { let _this = this; // pending, rejected, resolved _this.status = 'pending'; _this.value = ''; _this.resolveFnArr = []; _this.rejectFnArr = []; function resolve (param) { if (_this.status === 'pending') { _this.status = 'resolved'; _this.value = param; _this.resolveFnArr.length && _this.resolveFnArr.forEach(f => { f(_this.value); }); } } function reject (reason) { if (_this.status === 'pending') { _this.status = 'rejected'; _this.value = reason; _this.rejectFnArr.length && _this.rejectFnArr.forEach(f => { f(_this.value); }); } } //捕獲構造異常 try { fn(resolve,reject); } catch (e) { reject(e); } } MyPromise.prototype.then = function (resolvedFn, rejectedFn) { let _this = this; let tempPromise = null; switch (_this.status) { case 'pending': { tempPromise = new MyPromise(function (resolve, reject) { _this.resolveFnArr.push(function () { try { let temp = resolvedFn(_this.value); resolve(temp); } catch (error) { reject(error); } }); }); break; } case 'resolved': { tempPromise = new MyPromise(function (resolve, reject) { try { let temp = resolvedFn(_this.value); resolve(temp); } catch (error) { reject(error); } }); break; } case 'rejected': { tempPromise = new MyPromise(function (resolve, reject) { try { let temp = rejectedFn(_this.value); resolve(temp); } catch (error) { reject(error); } }); break; } default: {} } return tempPromise; }
未完待續。。