Promise

时间:2021-11-12 21:55:40

回调地狱

 1         var base = 0;
 2         var img = new Image();
 3         img.src = "./images/3-.jpg";
 4         img.onload = function(){
 5             base  = img.width;
 6             var img1 = new Image();
 7             img1.src = "./images/4-.jpg";
 8             img1.onload = function(){
 9                 base  = img1.width;
10                 var img2 = new Image();
11                 img2.src = "./images/5.jpg";
12                 img2.onload = function(){
13                     base  = img2.width;
14                     console.log(base);
15                 }
16             }
17         }

 

使用函数式编程解决回调地狱

 1         var base = 0;
 2         init();
 3         function init(){
 4             var img = new Image();
 5             img.onload =  loadHandler;
 6             img.src = "./images/3-.jpg";
 7         }
 8 
 9         function loadHandler(e){
10             base  = this.width;
11             if(this.src.indexOf("3-.jpg")>-1){
12                 this.src = "./images/4-.jpg";
13             }else if(this.src.indexOf("4-.jpg")>-1){
14                 this.src = "./images/5-.jpg";
15                 console.log(base);
16             }
17         }

 

 

非函数式编程只能使用Promise解决回调地狱

  

 1         // resolve是成功时要执行的回调函数
 2         // reject是失败时要执行的回调函数
 3         /*  var p=new Promise(function(resolve,reject){
 4              var img=new Image();
 5              img.src="./img/3-.jpg";
 6              img.onload=function(){
 7                  // resolve函数可以带入一个参数
 8                  resolve(img);
 9              }
10              img.onerror=function(){
11                  // reject函数也可以带入一个参数
12                  reject(img.src);
13              }
14          }) */
15 
16 
17         p.then(function(img){
18             // reslove调用
19              console.log(img);
20          },function(src){
21             // reject调用
22              console.log(src);
23          }) 

 

简单封装下Promise

 1         class Promise{
 2             status = "pending";
 3             constructor(fn){
 4                 console.log(this);
 5                 fn(this.resolve,this.reject.bind(this));
 6             }
 7             resolve(result){
 8                 if(this.status !== "pending") return;
 9                 var ids = setTimeout((function(){
10                     this.setVal("resolve",result);
11                     clearTimeout(ids);
12                 }).bind(this),0);
13             }
14             reject(error){
15                 if(this.status !== "pending") return;
16                 var ids = setTimeout((function(){
17                     this.setVal("reject",error);
18                     clearTimeout(ids);
19                 }).bind(this),0);
20             }
21             then(_resolve,_reject){
22                 this._resolve = _resolve;
23                 this._reject = _reject;
24             }
25             catch(reject){
26                 this._reject = _reject;
27             }
28             setVal(_status,_arg){
29                 this.status = _status;
30                 if(_status === "resolve" && this._resolve){
31                     this._resolve(_arg);
32                 }else if(_status === "reject" && this._reject){
33                     this._reject(_arg);
34                 }
35             }
36         }
37 
38         
39         function loadImage(){
40             return new Promise(function(resolve,reject){
41                 var img = new Image();
42                 img.src = "./images/3-.jpg";
43                 img.onload = function(){
44                     resolve(img);
45                 }
46                 img.onerror = function(){
47                     reject(img.src);
48                 }
49             });
50         }
51         loadImage().then(function(img){
52             console.log(img);
53         },function(msg){
54             console.log(msg);
55         });