1. 程式人生 > >ajax的再次封裝!(改進版) —— new與不 new 有啥區別?

ajax的再次封裝!(改進版) —— new與不 new 有啥區別?

  生命不息重構不止!

  上一篇寫了一下我對ajax的再次封裝的方法,收到了很多有價值的回覆,比如有童鞋建議用$.extend,一開始還以為要做成外掛呢,後來才知道,原來這個東東還可以實現合併。省著自己再去做判斷了。

  還有童鞋說“要不要多加點傳入引數”,這一下提醒我了,ajax有很多引數呀,常用的我考慮進來了,但是還有很多不常用的呢,如果需要的話怎麼辦?在看看我呼叫原生ajax的方式,kao,完全不支援增加其他引數嗎,這怎麼行,改一定要改。於是就改成了這樣。

 1 //對ajax的封裝 //最基礎的一層封裝
 2 Nature.Ajax = function(ajaxInfo) {
3 4 //定義預設值 5 //type: "GET", //訪問方式:如果dataPata不為空,自動設定為POST;如果為空設定為GET。 6 //dataType: Nature.AjaxConfig.ajaxDataType, //資料型別:JSON、JSONP、text 7 //cache: true, //是否快取,預設快取 8 //urlPara: {},//url後面的引數。一定會加在url後面,不會加到form裡。 9 //formData: {},//表單裡的引數。如果dataType是JSON,一定加在form裡,不會加在url後面;如果dataType是JSONP的話,只能加在url後面。
10 //url: //依靠上層指定 11 12 //補全ajaxInfo 13 //dataType 14 if (typeof ajaxInfo.dataType == "undefined") ajaxInfo.dataType = Nature.AjaxConfig.ajaxDataType; 15 //cache 16 if (typeof ajaxInfo.cache == "undefined") ajaxInfo.cache = false; 17 18 //type 19 if (typeof ajaxInfo.formData == "undefined") {
20 ajaxInfo.type = "GET"; 21 } else { 22 ajaxInfo.type = "POST"; 23 ajaxInfo.data = ajaxInfo.formData; 24 } 25 26 //處理URL和引數 27 if (typeof ajaxInfo.urlPara != "undefined") { 28 var tmpUrlPara = ""; 29 var para = ajaxInfo.urlPara; 30 for (var key in para) { 31 tmpUrlPara += "&" + key + "=" + para[key]; 32 } 33 34 if (ajaxInfo.url.indexOf('?') >= 0) { 35 //原地址有引數,直接加 36 ajaxInfo.url += tmpUrlPara; 37 } else { 38 //原地址沒有引數,變成?再加 39 ajaxInfo.url += tmpUrlPara.replace('&', '?'); 40 } 41 } 42 43 //處理xhrFields 44 if (typeof ajaxInfo.xhrFields == "undefined") { 45 ajaxInfo.xhrFields = { 46 //允許cors跨域訪問時新增cookie 47 withCredentials: true 48 }; 49 } else { 50 if (typeof ajaxInfo.xhrFields.withCredentials == "undefined") { 51 ajaxInfo.xhrFields.withCredentials = true; 52 } 53 } 54 55 //處理error 56 var error = ajaxInfo.error; 57 ajaxInfo.error = function(request, textStatus, errorThrown) { 58 //訪問失敗,自動停止載入動畫,並且給出提示 59 alert("提交" + ajaxInfo.title + "的時候發生錯誤!"); 60 if (typeof top.spinStop != "undefined") 61 top.spinStop(); 62 if (typeof error == "function") error(); 63 }; 64 65 //處理success 66 var success = ajaxInfo.success; 67 ajaxInfo.success = function(data) { 68 //顯示除錯資訊 69 if (typeof(parent.DebugSet) != "undefined") 70 parent.DebugSet(data.debug); 71 72 if (typeof(ajaxInfo.ctrlId) == "undefined") 73 success(data); 74 else { 75 success(ajaxInfo.ctrlId, data); 76 } 77 }; 78 79 //開始執行ajax 80 $.ajax(ajaxInfo); 81 };

  雖然還是隻有一個引數,但是這個引數是一個集合。可以包含很多的元素(屬性)。改進後完全以這個引數為主,進行預設的屬性設定,最後直接把這個引數傳遞給原生ajax,這樣呼叫的時候,可以根據ajax的規則來設定自己需要的屬性了。

  另外去掉了  defaultInfo。因為看來看去,就是一個Nature.sendDataType 算是預設值,其他的都不算了。所以乾脆去掉吧。改進後既可以很方便的呼叫,也確保了其擴充套件性,可以增加其他的屬性。

 1 var ajax = Nature.Ajax; 
 2 
 3 ajax({
 4             url:"",
 5             formData: jsonValue,
 6             urlPara: ajaxUrlPara,
 7             title: "儲存資料",
 8             success: function(data) {
 9                 if (data.err.length == 0) {
10                     alert("儲存成功!");
11                     //清空表單
12              
13                 } else {
14                     alert(data.err);
15                 }
16 
17                 if (typeof callback == "function") {
18                     callback();
19                 }
20 
21             }
22         });

  好像還是要寫不少東東,但是仔細看看的話,可以發現有很多優勢,首先明確了哪些引數用url傳遞,哪些引數用表單post傳遞。error有了統一的處理,蘇測試時success了也可以統一顯示除錯資訊。不用去考慮是post還是get是json還是jsonp,這些都會統一處理。

  最後涉及到了一個併發的問題,因為我想實現“複用”,這個函式會被載入到top頁面裡,其他的子頁面都會到top裡呼叫這個函式,那麼如果同時開啟兩個iframe,一起載入,併發了怎麼辦?會不會產生衝突?如果new的話,併發的時候肯定不會產生衝突,但是jQuery的ajax似乎沒有new,那麼他是如何處理併發的呢?

  我是實踐派,遇到問題了首先想到的是寫點程式碼測試一下,然後再去找找原理和理論。於是我就寫了個程式碼模擬測試一下,看看併發的情況。

 1  var state = 1;
 2         
 3         function fun1(para, timestep) {
 4             var temp = para.a1;//內部變數
 5 
 6             para.a1 = para.a1 * 100;//修改引數看看
 7 
 8             this.time = timestep;//這個不new的時候能用嗎?
 9 
10             var self = this;//setTimeout裡面用不了這個this,那麼江湖規矩。
11             
12             state ++;//全域性變數,不解釋
13             
14             window.setTimeout(function() { //模擬回撥
15                 console.log(para.name);
16                 console.log("para.a1 : " + para.a1);
17                 console.log("temp:" + temp);
18                 console.log("this.time: " + self.time);
19 
20 
21             },timestep);
22         }
23 
24         fun1({ name: "aa1",a1:10 }, 1000);
25         fun1({ name: "aa2", a1: 20 }, 100);
26 
27         var f1 = new fun1({ name: "aa3", a1: 30 }, 10);

大家猜猜輸出結果是啥?

相關推薦

ajax再次封裝(改進) —— new new 區別

  生命不息重構不止!   上一篇寫了一下我對ajax的再次封裝的方法,收到了很多有價值的回覆,比如有童鞋建議用$.extend,一開始還以為要做成外掛呢,後來才知道,原來這個東東還可以實現合併。省著自己再去做判斷了。   還有童鞋說“要不要多加點傳入引數”,這一下提醒我了,ajax有很多引數

C++類和物件詳解(newnew區別

一、"類" 的介紹     在C++中, 用 "類" 來描述"物件", 所謂的"物件"是指現實世界中的一切事物。那麼類就可以看做是對相似事物的抽象, 找到這些不同事物間的共同點, 如自行車和摩托車, 首先他們都屬於"物件", 並且具有一定得相同點, 和一些不同點, 相同點如

C++之建立物件時的newnew

        C++在建立物件的時候可以採用兩種方式:(例如類名為Test) Test test  或者 Test* pTest = new Test()。         這兩種方法都可以例項化一個物件,但是這兩種方法有很大的區別,區別在於物件內容所在的記憶體空間不同,

條件覆蓋分支覆蓋區別

 我們首先來看一下這幾些測試覆蓋的定義: 定義一、 語句覆蓋:它要求被測程式的每一可執行語句在測試中儘可能都檢驗過; 定義二、分支覆蓋:要求程式中所有判定的分支儘可能得到檢驗; 定義三、條件覆蓋:當判定式中含有多個條件時,要求每個條件的取值均得到檢驗; 從這些定義我們可以很容

C#中nullstring.Empty區別

當你只定義一個str而不為其分配記憶體時用string str=null,但是在接下來你使用它之前必須為它賦值如str=“xxxx”也就是為它初始化 而string str= string.Empty是定義和初始化放在了一起它實際是等價於string str=null;st

$(document).ready(function() {});寫什麼區別

不寫$(document).ready(function() {});,直接在<script></script>中寫事件,方法可以嗎? $(document).ready 裡的程式碼是在頁面內容都載入完才執行的,你直接寫到script標籤裡,當頁面

Transaction之坑:Spring中配置Transaction配置區別

首先 Spring中 Transaction管理 配置有兩種方式: Annotation式:@Transactional Xml式:<tx:method /> Not

三子棋改進——增加人對決

三子棋 函式分為三部分 1.test.c檔案 2.game.h檔案 3.game.c檔案 改進思想:1.增加了人與人對決的man_game( )函式從而增加了一點小功能,使得玩家的選擇變得更加廣泛。 2.men_game函式與game函式功能完全相同;只是分別呼

ajax再次封裝

js的動態載入、快取、更新以及複用 系列有點卡文,放心會繼續的。先來點更基礎的,為js的載入做點鋪墊。   jQuery的ajax本來就很方便了,為啥還要在進一步的封裝呢?這個首先要看專案的具體需求了,如果覺得不需要,那麼完全可以直接用jQuery提供的各種ajax的方法。如果像我似地,感覺不太方便的話

C++——創建類的時候用new不用new區別

delet 註意 我們 兩種 多少 內存泄露 start 配方 sdn 轉自:https://www.cnblogs.com/tony-li/p/4111588.html C++在創建對象的時候可以采用兩種方式:(例如類名為Test) Test test 或者 Test*

深入講解Go語言中函式newmake的使用和區別

深入講解Go語言中函式new與make的使用和區別     大家都知道Go語言中的函式new與函式make一直是新手比較容易混淆的東西,看著相似,但其實不同,不過解釋兩者之間的不同也非常容易,下面這篇文章主要給大家介紹了關於Go語言中函式new與make區別的相關資料

C++——建立類的時候用new不用new區別(從堆和棧的解讀)

轉自:https://www.cnblogs.com/tony-li/p/4111588.html C++在建立物件的時候可以採用兩種方式:(例如類名為Test) Test test  或者 Test* pTest = new Test()。         這兩

newmalloc的10點區別

閱讀目錄 new與malloc的10點區別 1. 申請的記憶體所在位置 2.返回型別安全性 3.記憶體分配失敗時的返回值 4.是否需要指定記憶體大小 5.是否呼叫建構函式/解構函式 6.對陣列的處理 7.n

JAVA中陣列初始化時用new不用new區別

不同於String類,String由於實現了常量池 所以new 和不new 有區別:new的話,引用變數指向堆區。不new的話,引用變數指向常量池。對於陣列的定義,初始化時用new與不用new 沒區別,

基礎備忘:細說newmalloc的10點區別

正文 回到頂部 前言 幾個星期前去面試C++研發的實習崗位,面試官問了個問題: new與malloc有什麼區別? 這是個老生常談的問題。當時我回答new從自由儲存區上分配記憶體,malloc從堆上分配記憶體;new/delete會呼叫建構函式/解構函式對

C++中的new、operator newplacement new

[http://www.cnblogs.com/luxiaoxun/archive/2012/08/10/2631812.html] C++中的new/delete與operator new/operator delete new operator/delete oper

C/C++——C++中newmalloc的10點區別

前言 幾個星期前去面試C++研發的實習崗位,面試官問了個問題: new與malloc有什麼區別? 這是個老生常談的問題。當時我回答new從自由儲存區上分配記憶體,malloc從堆上分配記憶體;new/delete會呼叫建構函式/解構函式對物件進行初始化與銷燬;

C++——建立類的時候用new不用new區別(轉)

C++在建立物件的時候可以採用兩種方式:(例如類名為Test) Test test  或者 Test* pTest =

MySQL中使用索引使用索引的區別

pan 並發 並發數 table def ring primary innodb zab 為了回答索引對數據庫性能的影響,做了一次簡單的實驗。 測試環境    MySQL 5.7.10 innodb 100萬隨機數據 表結構 CREATE TABLE `

js調用函數時加括號加括號的區別

調用函數 執行 查看 return 區別 代碼 調用 dem 部分 函數名其實就是指向函數體的指針 不加括號, 可以認為是查看該函數的完整信息, 不加括號傳參,相當於傳入函數整體 加括號 表示立即調用(執行)這個函數裏面的代碼(花括號部分的代碼) 例2: functio