国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

重構(gòu)JS代碼

2019-11-15 02:27:05
字體:
供稿:網(wǎng)友

重構(gòu)JS代碼 - 讓JS代碼平面化

js中的嵌套函數(shù)用的很多,很牛叉,那為何要平面化?

  • 易懂(自己及他人)
  • 易修改(自己及他人)

平時Ajax調(diào)用寫法(基于jQuery)

$.post('url', jsonObj,                function (data)                 {                      if(data)                      {                           var tips = $.ligerDialog.tip({ title: 'Tip', content: 'Operation successful!' });                           setTimeout(function () { tips.close(); }, 2000);                      }                      else                      {                            var tips = $.ligerDialog.tip({ title: 'Tip', content: 'Operation Failed!' });                            setTimeout(function () { tips.close(); }, 2000);                      }                }        );

缺點是什么?

  1. 函數(shù)嵌套后,理解起來比較吃力
  2. 函數(shù)嵌套后,一行函數(shù)調(diào)用寫成了很多行,很容易因為逗號、括號等造成語法錯誤
  3. jQuery和liger在應(yīng)用代碼中強耦合,要是以后要更換UI框架,需要進行地毯式搜索...

加入延遲特性 - Deferred

var ajaxHandler = $.post('url', params);ajaxHandler.done(checkServerResponse);var checkServerResponse=function(result){      if(result)       {             var tips = $.ligerDialog.tip({ title: 'Tip', content: 'Operation successful!' });              setTimeout(function () { tips.close(); }, 2000);        }        else        {                var tips = $.ligerDialog.tip({ title: 'Tip', content: 'Operation Failed!' });                setTimeout(function () { tips.close(); }, 2000);         }}

釋疑:

  1. 改后的js與先前的沒有很大區(qū)別:如果js采用了OO方式編寫,再來看這段代碼就很清晰了(可以簡單的把checkServerResponse理解為一個
  2. 要是有多個后續(xù)請求呢?可以寫成$.when($.post(url)).then(handler1).then(handler2).done(successHandler).always(alwaysHandler).fail(failHandler);

用jQuery的事件來解耦 - 不依賴具體技術(shù)

先要注冊事件:

$(document).on("saveSuccess", onSaveSuccess);$(document).on("saveFail", onSaveFail);

然后改造checkServerResponse函數(shù):

var checkServerResponse= function (result) {        if (result)            $(document).trigger("saveSuccess");        else            $(document).trigger("saveFail");    }

好處:

邏輯代碼具體不依賴于具體技術(shù),比如上面的onSaveSuccess和onSaveFail,可以是下面的ligerUI:

onSaveSuccess: function () {        var tips = $.ligerDialog.tip({ title: 'Tip', content: 'OK!' });        setTimeout(function () { tips.close(); }, 2000);    },    onSaveFail: function () {        var tips = $.ligerDialog.tip({ title: 'Tip', content: 'Fail!' });        setTimeout(function () { tips.close(); }, 2000);    }

也可以是下面的:

onSaveSuccess: function () {        alert("OK");    },    onSaveFail: function () {        alert("Fail");    },

其實就是接口隔離的原理。

用Pub/Sub模式來解耦 - 不依賴具體技術(shù)

這種方式比起上面jQuery原生的事件處理方式更加專業(yè),比如:amplify。

使用方式就看基本類似,如下:

amplify.subscribe("saveSuccess", this.onSaveSuccess);amplify.subscribe("saveFail", this.onSaveFail);checkServerResponse: function (result) {        if (result)            amplify.publish("saveSuccess");        else            amplify.publish("saveFail");}

amplify比jQuery原生的事件好的地方在于amplify支持優(yōu)先級,并且可以在訂閱函數(shù)中控制是否繼續(xù)執(zhí)行后續(xù)的訂閱函數(shù),具體用法大家可以參考amplify官網(wǎng)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 太康县| 思茅市| 柳林县| 宁安市| 安塞县| 白山市| 汽车| 深州市| 枣庄市| 日照市| 红原县| 若羌县| 永城市| 慈溪市| 吉安市| 绥化市| 扎囊县| 余姚市| 奉化市| 咸宁市| 前郭尔| 金沙县| 广州市| 阜平县| 岳西县| 蒙山县| 大连市| 石城县| 始兴县| 英山县| 通化县| 拉萨市| 准格尔旗| 永兴县| 景德镇市| 陆丰市| 长治市| 天长市| 竹溪县| 宁都县| 张家口市|