batch 請求的回覆:
使用合適的 handler 解析:
該 handler accept 欄位:multipart/mixed
首先根據響應欄位,獲取 content-type:
content-type 欄位,透過;
分隔:
media type:multipart/mixed
返回一個 JSON 物件,包含 mediaType 和 boundary 屬性:
batch 請求的處理器是 batchParser
:
執行下一行 readBatch 方法:
boundary 的一個例子:batchresponse_16aba97e-4311-41a4-8c64-302727d1d02e
readBatch 的具體處理邏輯還是,基於字串匹配,即使用 indexOf 查詢 boundary 字串:
readline 的實現就是讀取單行:
batch 第一個 part 的頭部欄位被讀取了出來:
media type 必須和硬編碼的值一致:application/http
batch 包含的第一個請求 count 的資料已經讀取成功了:
已經讀取成功了,還要 dispatch:
count 的 media-type 是 text/plain:
return false 了,response 的 body 有值,data 為 undefined:
有4個可用的 handler:
text/plain 負責讀取 response.body.
textParser 的邏輯最簡單,直接返回 body 欄位給 response.data:
讀取第二個 part:
這個 part 的 content-type 為 json,因此使用 json handler:
if (handlerAccepts(handler, cType)) {
var readContext = createReadWriteContext(cType, version, context, handler);
readContext.response = response;
response.data = parseCallback(handler, body, readContext);
return response.data !== undefined;
}
上述程式碼的語義是,只有當一個 handler 透過了函式 handlerAccepts
的過濾之後,才能呼叫 parseCallback,將解析的結果,傳遞給 response.data
.
json handler 使用 JSON.parse 原生 API 進行 json 資料的序列化操作。
序列化成功的 json 資料:
最後返回的 response 是一個陣列:
呼叫最外層的 success handler:
batch 請求的回撥函式,在函式 _submitBatchRequest
內部:
更多Jerry的原創文章,盡在:"汪子熙":