回调地狱
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 });