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); } } );
缺點是什么?
加入延遲特性 - 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的事件來解耦 - 不依賴具體技術(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)。
新聞熱點
疑難解答