es6 promise简易实现
直接上代码吧:
function MyPromise(fn) { // 固定this指向 let _this = this; // pending, rejected, resolved _this.status = 'pending'; // 存储promise定义时传入的值 _this.value = ''; // 存储resolve回调函数,主要用于resolve异步执行时存储then中传入的回调函数,非异步直接在then中执行 _this.resolveFnArr = []; // 存储reject回调函数 _this.rejectFnArr = []; // pending -> resolved function resolve (param) { if (_this.status === 'pending') { _this.status = 'resolved'; _this.value = param; // 异步执行resolve时 _this.resolveFnArr.length && _this.resolveFnArr.forEach(f => { f(_this.value); }); } } // pending -> rejected function reject (reason) { if (_this.status === 'pending') { _this.status = 'rejected'; _this.value = reason; // 异步执行reject时 _this.rejectFnArr.length && _this.rejectFnArr.forEach(f => { f(_this.value); }); } } // 执行构造函数并捕获构造异常 try { fn(resolve,reject); } catch (e) { reject(e); } } // 添加then方法 MyPromise.prototype.then = function (resolvedFn, rejectedFn) { let _this = this; // 返回promise对象链式调用 let tempPromise = null; switch (_this.status) { case 'pending': { tempPromise = new MyPromise(function (resolve, reject) { // 在resolve或者reject之前执行then函数,先把回调函数存储起来,状态改变后执行 _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; }
未完待续。。