js中的嵌套函數用的很多,很牛叉,那為何要平面化?
平時Ajax調用寫法(基于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); } } );
缺點是什么?
加入延遲特性 - 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); }}
釋疑:
用jQuery的事件來解耦 - 不依賴具體技術
先要注冊事件:
$(document).on("saveSuccess", onSaveSuccess);$(document).on("saveFail", onSaveFail);
然后改造checkServerResponse函數:
var checkServerResponse= function (result) { if (result) $(document).trigger("saveSuccess"); else $(document).trigger("saveFail"); }
好處:
邏輯代碼具體不依賴于具體技術,比如上面的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模式來解耦 - 不依賴具體技術
這種方式比起上面jQuery原生的事件處理方式更加專業,比如: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支持優先級,并且可以在訂閱函數中控制是否繼續執行后續的訂閱函數,具體用法大家可以參考amplify官網。
新聞熱點
疑難解答