手写实现Promise的全部功能
发现的问题
在此过程中,发现 自己对 函数中的this指向,和词法环境 的一些细节没有掌握好,实现过程很痛苦!
解决
应该恶补
下面上代码
1 function Promise(executor){ 2 this.PromiseState = 'pending'; 3 this.PromiseResult = undefined; 4 this.resolvers = []; 5 6 var self = this; 7 function resolve(data){ 8 if(self.PromiseState == 'pending'){ 9 self.PromiseState = 'fulfilled'; 10 self.PromiseResult = data; 11 12 if(typeof self.resolvers !== 'undefined'){ 13 self.resolvers.forEach(element => { 14 element.onResolve(); 15 }); 16 } 17 } 18 } 19 20 function reject(data){ 21 console.log("执行到我了"); 22 if(self.PromiseState == 'pending'){ 23 console.log('执行到我了'); 24 self.PromiseState = 'rejected'; 25 self.PromiseResult = data; 26 27 if(typeof self.resolvers !== 'undefined'){ 28 self.resolvers.forEach(element => { 29 element.onReject(); 30 }); 31 } 32 } 33 34 } 35 executor(resolve,reject); 36 } 37 Promise.prototype.then = function(onResolve,onReject){ 38 if(typeof onReject !== 'function'){ 39 onReject:reason => {throw reason} 40 } 41 if(typeof onResolve !== 'function'){ 42 onResolve:value =>{return value} 43 } 44 var self = this; 45 46 return new Promise((resolve,reject)=>{ 47 var callback = function(type){ 48 try{ 49 var result = type(self.PromiseResult); 50 }catch(e){ 51 reject(e); 52 } 53 if(result instanceof Promise){ 54 result.then(data => { 55 resolve(data); 56 },reason => { 57 reject(reason); 58 }) 59 }else{ 60 resolve(result); 61 } 62 } 63 if(this.PromiseState == 'fulfilled'){ 64 callback(onResolve); 65 } 66 if(this.PromiseState == 'rejected'){ 67 callback(onReject); 68 } 69 if(this.PromiseState = 'pending'){ 70 this.resolvers.push( 71 { 72 onResolve:function (){ 73 callback(onResolve); 74 } 75 , 76 onReject:function (){ 77 callback(onReject); 78 } 79 } 80 ); 81 } 82 }); 83 84 } 85 86 Promise.prototype.catch = function(onReject){ 87 return this.then(undefined,onReject); 88 } 89 90 Promise.resolve = function(value){ 91 return new Promise((resolve,rejected)=>{ 92 resolve(value); 93 }); 94 } 95 96 Promise.reject = function(reason){ 97 return new Promise((resolve,rejected)=>{ 98 rejected(reason); 99 }); 100 } 101 102 Promise.all =function(pArr){ 103 let count = 0; 104 let arr = []; 105 return new Promise((resolve,reject)=>{ 106 var length = pArr.length; 107 for(var i = 0;i<length;i++){ 108 console.log('_________'); 109 110 pArr[i].then( 111 value=>{ 112 console.log("resolve"); 113 count++; 114 arr[i] = (value); 115 // console.log(i); 116 console.log('22222'); 117 if(count == length){ 118 console.log('111112312313') 119 resolve(arr); 120 } 121 }, 122 reason=>{ 123 reject(reason); 124 }); 125 } 126 // pArr.forEach(function (item,index){ 127 // console.log(item); 128 // console.log('__________'); 129 // item.then(value => { 130 // arr.push(value); 131 // if(++count == pArr.length){ 132 // resolve(arr); 133 // console.log('2'); 134 // } 135 // console.log('1'); 136 // },reason =>{ 137 // console.log('3'); 138 // reject(reason); 139 // }); 140 // }); 141 }); 142 } 143 144 Promise.race = function(pArr){ 145 return new Promise((resolve,reject)=>{ 146 pArr.forEach((item,index)=>{ 147 item.then(v =>{ 148 resolve(v); 149 },r=>{ 150 reject(r) 151 }); 152 }) 153 }) 154 }
保持好奇,保持学习,做时间的朋友