讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議146:使用自定義格式進行通信 >

建議146:使用自定義格式進行通信

最理想的數據格式只包含必要的結構,並且能夠分解出每個字段。可以自定義一種格式,只簡單地用一個分隔符將數據連接起來。


d;Tyler;John


這些分隔符基本上創建了一個數據數組,類似於一個逗號分隔的列表。通過使用不同的分隔符,可以創建多維數組。這裡是用自定義的字符分隔方式構造的用戶列表:


alice:Alice:[email protected];

bob:Bob:[email protected];

carol:Carol:[email protected];

dave:Dave:[email protected]


這種格式非常簡潔,與其他格式相比(不包括純文本),其數據/結構比例明顯提高。自定義格式下載迅速,易於解析,只需調用字符串的split將分隔符作為參數傳入即可。更複雜的自定義格式具有多種分隔符,需要在循環中分解所有數據。注意,在JavaScript中這些循環處理起來是非常快的。split是最快的字符串操作之一,通常可以在數毫秒內處理具有超過10 000個元素的由分隔符分割的列表。下面的例子給出解析上述格式的方法。


function parseCustomFormat(responseText){

var users=;

var usersEncoded=responseText.split(';');

var userArray;

for(var i=0,len=usersEncoded.length;i<len;i++){

userArray=usersEncoded[i].split(':');

users[i]={

id:userArray[0],

username:userArray[1],

realname:userArray[2],

email:userArray[3]

};

}

return users;

}


當創建自定義格式時,最重要的決定是採用何種分隔符。在理想情況下,分隔符應當是一個單字符,而且不能存在於數據之中。ASCII字符表中前面的幾個字符在大多數服務器端語言中能夠正常工作且容易書寫。下面講述如何在PHP中使用ASCII碼。


function build_format_custom($users){

$row_delimiter=chr(1);//\u0001 in JavaScript.

$field_delimiter=chr(2);//\u0002 in JavaScript.

$output=array;

foreach($users as$user){

$fields=array($user['id'],$user['username'],$user['realname'],$user['email']);

$output=implode($field_delimiter,$fields);

}

return implode($row_delimiter,$output);

}


這些控制字符在JavaScript中使用Unicode標注(如\u0001)表示。split函數可以用字符串或正則表達式作為參數。如果希望數據中存在空字段,那麼就使用字符串;如果分隔符是一個正則表達式,那麼IE中的split將跳過相鄰兩個分隔符中的第二個分隔符。這兩種參數類型在其他瀏覽器上等價。


var rows=req.responseText.split(/\u0001/);

var rows=req.responseText.split("\u0001");


這是字符分隔的自定義格式的性能數據,使用XHR和動態腳本標籤注入。

XHR和動態腳本標籤注入都可以使用這種格式。在兩種情況下都要解析字符串,在性能上沒有實質上的差異。對於非常大的數據集,自定義格式是最快的傳輸格式,甚至可以在解析速度和下載時間上「擊敗」本機執行的JSON。用此格式向客戶端傳送大量數據只需要很少的時間。

總的來說,越輕量級的格式越好,最好是JSON和字符分隔的自定義格式。如果數據集很大或解析時間成問題,那麼就使用以下兩種格式之一:

❑JSONP數據,用動態腳本標籤插入法獲取。這種格式將數據視為可運行的JavaScript而不是字符串,解析速度極快。這種格式能夠跨域使用,但不應涉及敏感數據。

❑字符分隔的自定義格式,使用XHR或動態腳本標籤插入技術提取,使用split解析。此技術在解析非常大數據集時比JSONP技術略快,而且通常文件尺寸更小。注意,這些數據只是在一個瀏覽器上進行一次測試獲得的。測試結果可用做大概的性能指標,而不是確切的數字。