手写实现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 }

 

 
 
posted @ 2021-11-10 13:36  睡成蛆  阅读(44)  评论(0编辑  收藏  举报