真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

JavaScript如何實(shí)現(xiàn)序列化鏈?zhǔn)浇Y(jié)構(gòu)

這篇文章主要介紹了JavaScript如何實(shí)現(xiàn)序列化鏈?zhǔn)浇Y(jié)構(gòu)的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇JavaScript如何實(shí)現(xiàn)序列化鏈?zhǔn)浇Y(jié)構(gòu)文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括楚雄州網(wǎng)站建設(shè)、楚雄州網(wǎng)站制作、楚雄州網(wǎng)頁(yè)制作以及楚雄州網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,楚雄州網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到楚雄州省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

一、概述

在JavaScript中,鏈?zhǔn)侥J酱a,太多太多,如下:

if_else:

if(...){     //TODO }else if(...){     //TODO }else{     //TODO }

switch:

switch(name){     case ...:{         //TODO         break;     }     case ...:{         //TODO         break;     }     default:{         //TODO         } }

疑問:諸如上述這些鏈?zhǔn)酱a,倘若,我們想將其扁平化鏈?zhǔn)教幚砟??如下?/p>

//fn1,f2,f3為處理函數(shù) _if(fn1)._elseIf(fn2)._else(fn3);

下面我們就來(lái)一起嘗試實(shí)現(xiàn)下唄。

二、鏈?zhǔn)酱a扁平化

假如,現(xiàn)在我們有如下鏈?zhǔn)酱a:

if(name === 'Monkey'){     console.log('yes, I am Monkey'); }else if(name === 'Dorie'){     console.log('yes, I am Dorie'); }else{     console.log('sorry, over for ending!'); }

好了,現(xiàn)在我們一步一步將其”扁平化”。

其實(shí)看看上面的代碼,不難發(fā)現(xiàn),if…else這種格式,其實(shí)就是數(shù)據(jù)結(jié)構(gòu)中的單鏈表,那么,初步利用JavaScript實(shí)現(xiàn)單鏈表,如下:

var thens = []; thens.resolve = function(name){     for(var i = 0, len = this.length; i < len;i++){         if(this[i](name) !== 'next'){             break;         }     } } thens.push(f1, f2, f3);

其中f1,f2,f3為判斷函數(shù),并且我們假設(shè),如果諸如f1、f2、f3返回’next’時(shí),就繼續(xù)往下查找,否則,停止往下查找。如下:

function f1(name){     if(name === 'Monkey'){         console.log('yes, I am Monkey');     }else{         return 'next';     } } function f2(name){     if(name === 'Dorie'){         console.log('yes, I am Dorie');     }else{         return 'next';     } } function f3(){     console.log('sorry, over for ending!'); }

好了,這就是鏈表的模式。

但是,我們的最終目的是想實(shí)現(xiàn)如下這樣的呢?

//fn1,f2,f3為處理函數(shù) _if(fn1)._elseIf(fn2)._else(fn3);

你可能會(huì)說(shuō),將上述代碼改成如下這樣,不就好了嗎??。?/p>

thens.push(f1).push(f2).push(f3).resolve();

But,JavaScript的push方法返回的是數(shù)組的新長(zhǎng)度,而不是數(shù)組對(duì)象哦。

So,那我們只能新寫一個(gè)add方法,效果和push一樣,但是返回?cái)?shù)組對(duì)象。如下:

thens.add = function(f){     if(typeof f === 'function'){         this.push(f);         return this;             }         }

測(cè)試代碼如下:

var thens = []; thens.add = function(f){     if(typeof f === 'function'){         this.push(f);         return this;             }         } thens.resolve = function(name){     for(var i = 0, len = this.length; i < len;i++){         if(this[i](name) !== 'next'){             break;         }     }     } thens.add(f1).add(f2).add(f3).resolve();

但是,這樣有個(gè)缺點(diǎn),我們是將add、resolve方法綁定在全局變量thens中的,總不能每次創(chuàng)建一個(gè)數(shù)組時(shí),都復(fù)制粘貼一遍方法吧,所以重構(gòu)代碼如下:

function Slink(){     this.thens = [];     this.thens.add = function(f){         if(typeof f === 'function'){             this.push(f);             return this;                 }             }     this.thens.resolve = function(name){         for(var i = 0, len = this.length; i < len;i++){             if(this[i](name) !== 'next'){                 break;             }         }         } }

顯然,add,resolve這種公共方法,在每次實(shí)例化時(shí),都創(chuàng)建一遍是不科學(xué)的,so,利用prototype在原有的基礎(chǔ)上繼續(xù)變形,如下:

function Slink(){     this.thens = []; } Slink.prototype = {     add: function(f){             if(typeof f === 'function'){                 this.thens.push(f);                 return this;                     }             },     resolve: function(name){             for(var i = 0, len = this.thens.length; i < len; i++){                 if(this.thens[i](name) !== 'next'){                     break;                 }             }         } }

測(cè)試代碼如下:

var thens = new Slink(); thens.add(f1).add(f2).add(f3); thens.resolve();

不錯(cuò),但是這樣,我們每次都得手動(dòng)new一個(gè)Slink,有點(diǎn)麻煩,所以,我們將new Slink這個(gè)過(guò)程,封裝到函數(shù)中,如同jQuery一樣,如下:

function $go(f){     return new Slink(f); } function Slink(f){     this.thens = [];     this.thens.push(f); } Slink.prototype = {     add: function(f){             if(typeof f === 'function'){                 this.thens.push(f);                 return this;                     }             },     resolve: function(name){             for(var i = 0, len = this.thens.length; i < len; i++){                 if(this.thens[i](name) !== 'next'){                     break;                 }             }         } }

測(cè)試代碼如下:

$go(f1).add(f2).add(f3).resolve();

好了,大功告成,接下來(lái)就是語(yǔ)法糖滴問題咯,整理代碼如下:

function _if(f){     return new Slink(f); } function Slink(f){     this.thens = [];     this.thens.push(f); } Slink.prototype = {     _elseIf: function(f){             if(typeof f === 'function'){                 this.thens.push(f);                 return this;                     }             },     _else: function(f){             return this._elseIf(f);     },     resolve: function(name){             for(var i = 0, len = this.thens.length; i < len; i++){                 if(this.thens[i](name) !== 'next'){                     break;                 }             }             return this;                 } }

測(cè)試代碼如下:

_if(f1)._elseIf(f2)._else(f3).resolve();

當(dāng)然,除開利用數(shù)組這種方式,還可以利用閉包,實(shí)現(xiàn)鏈?zhǔn)奖馄交Ч?,如下?/p>

var func = Function.prototype; func._else = func._elseIf = function(fn){     var _this = this;     return function(){         var res = _this.apply(this,arguments);         if(res==="next"){  //值為Boolean             return fn.apply(this,arguments);         }         return res;     } }

測(cè)試代碼如下:

function f1(name){     if(name === 'Monkey'){         console.log('yes, I am Monkey');     }else{         return 'next';     } } function f2(name){     if(name === 'Dorie'){         console.log('yes, I am Dorie');     }else{         return 'next';     } } function f3(){     console.log('sorry, over for ending!'); } f1._elseIf(f2)._else(f3)('Dorie');

三、異步代碼鏈?zhǔn)奖馄交?/strong>

在上面我們討論的都是同步過(guò)程,倘若,鏈?zhǔn)秸{(diào)用函數(shù)中有異步情況呢?

什么意思?如下:

function f1(name){     setTimeout(function(){         if(name === 'Monkey'){             console.log('yes, I am Monkey');         }else{             return 'next';         }     }, 2000); } function f2(name){     if(name === 'Dorie'){         console.log('yes, I am Dorie');     }else{         return 'next';     } } function f3(){     console.log('sorry, over for ending!'); }

我們將f1利用setTimeout變成了異步,按照上述代碼的邏輯,應(yīng)該是等f(wàn)1完全執(zhí)行完畢(包括setTimeout執(zhí)行)后,判斷是否執(zhí)行f2,但真的如此嗎?

測(cè)試代碼如下:

_if(f1)._elseIf(f2)._else(f3).resolve();

執(zhí)行代碼的結(jié)果就是,什么也不輸出。

Why?

因?yàn)镴avaScript是單線程嘛。

那該怎么解決呢?

由于有異步代碼,且必須在異步代碼后處理后續(xù)的鏈,那么我們就等待異步代碼執(zhí)行完畢后,才執(zhí)行后續(xù)的鏈嘛,如下:

function f1(name){     setTimeout(function(){         if(name === 'Monkey'){             console.log('yes, I am Monkey');         }else{             //處理后續(xù)鏈             this.resolve(name, 1);//1代表下一個(gè)需處理函數(shù)在數(shù)組中的位置         }     }.bind(this), 2000); }

好了,由于在函數(shù)中,我們使用了this,其代表Slink對(duì)象,且改變了resolve方法,固,需細(xì)微調(diào)整Slink構(gòu)造函數(shù)和原型鏈,如下:

function Slink(f){     this.thens = [];     this.thens.push(f.bind(this)); } Slink.prototype = {     _elseIf: function(f){             if(typeof f === 'function'){                 this.thens.push(f.bind(this));                 return this;                    }            },     _else: function(f){             return this._elseIf(f.bind(this));     },     resolve: function(name, flag){             for(var i = flag, len = this.thens.length; i < len; i++){                 if(this.thens[i](name) !== 'next'){                     break;                 }             }             return this;                } }

測(cè)試代碼如下:

function f1(name){     setTimeout(function(){         if(name === 'Monkey'){             console.log('yes, I am Monkey');         }else{             //處理后續(xù)鏈             this.resolve(name, 1);//1代表下一個(gè)需處理函數(shù)在數(shù)組中的位置         }     }.bind(this), 2000); } function f2(name){     if(name === 'Dorie'){         console.log('yes, I am Dorie');     }else{         return 'next';     } } function f3(){     console.log('sorry, over for ending!'); } _if(f1)._elseIf(f2)._else(f3).resolve('',0);

關(guān)于“JavaScript如何實(shí)現(xiàn)序列化鏈?zhǔn)浇Y(jié)構(gòu)”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“JavaScript如何實(shí)現(xiàn)序列化鏈?zhǔn)浇Y(jié)構(gòu)”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁(yè)題目:JavaScript如何實(shí)現(xiàn)序列化鏈?zhǔn)浇Y(jié)構(gòu)
轉(zhuǎn)載來(lái)于:http://weahome.cn/article/gsgjop.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部