学习jQuery源码之疑问1,2,3.......

CodeSmallTiger 2014-02-28 05:57:07
我想搞明白这个函数是做神马的

// Chain conversions given the request and the original response
function ajaxConvert( s, response ) {

var conv, conv2, current, tmp,
// Work with a copy of dataTypes in case we need to modify it for conversion
dataTypes = s.dataTypes.slice(),
prev = dataTypes[ 0 ],
converters = {},
i = 0;

// Apply the dataFilter if provided
if ( s.dataFilter ) {
response = s.dataFilter( response, s.dataType );
}

// Create converters map with lowercased keys
if ( dataTypes[ 1 ] ) {
for ( conv in s.converters ) {
converters[ conv.toLowerCase() ] = s.converters[ conv ];
}
}

// Convert to each sequential dataType, tolerating list modification
for ( ; (current = dataTypes[++i]); ) {

// There's only work to do if current dataType is non-auto
if ( current !== "*" ) {

// Convert response if prev dataType is non-auto and differs from current
if ( prev !== "*" && prev !== current ) {

// Seek a direct converter
conv = converters[ prev + " " + current ] || converters[ "* " + current ];

// If none found, seek a pair
if ( !conv ) {
for ( conv2 in converters ) {

// If conv2 outputs current
tmp = conv2.split(" ");
if ( tmp[ 1 ] === current ) {

// If prev can be converted to accepted input
conv = converters[ prev + " " + tmp[ 0 ] ] ||
converters[ "* " + tmp[ 0 ] ];
if ( conv ) {
// Condense equivalence converters
if ( conv === true ) {
conv = converters[ conv2 ];

// Otherwise, insert the intermediate dataType
} else if ( converters[ conv2 ] !== true ) {
current = tmp[ 0 ];
dataTypes.splice( i--, 0, current );
}

break;
}
}
}
}

// Apply converter (if not an equivalence)
if ( conv !== true ) {

// Unless errors are allowed to bubble, catch and return them
if ( conv && s["throws"] ) {
response = conv( response );
} else {
try {
response = conv( response );
} catch ( e ) {
return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
}
}
}
}

// Update prev for next iteration
prev = current;
}
}

return { state: "success", data: response };
}


英语不好 下面这句怎么翻译好理解点?
// Chain conversions given the request and the original response
...全文
163 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
CodeSmallTiger 2014-02-28
  • 打赏
  • 举报
回复
引用 7 楼 u011461314 的回复:
[quote=引用 1 楼 microlab2009 的回复:] 根据函数名ajaxConvert理解 估计是一个ajax之后对值进行json转换的 Chain conversions given the request and the original response翻译: 将给出的请求和原始响应进行链式转换 我英文也不好 不知道对不对
翻译的很好。 [/quote]
zhjdg 2014-02-28
  • 打赏
  • 举报
回复
引用 1 楼 microlab2009 的回复:
根据函数名ajaxConvert理解 估计是一个ajax之后对值进行json转换的
Chain conversions given the request and the original response翻译:
将给出的请求和原始响应进行链式转换

我英文也不好 不知道对不对

翻译的很好。
CodeSmallTiger 2014-02-28
  • 打赏
  • 举报
回复
s.dataTypes.slice()
是不是相当于
s.dataTypes.slice(0)
打字员 2014-02-28
  • 打赏
  • 举报
回复
s和s.dataTypes是己經定義好了的,s.dataTypes[0]是默認類型 所以后面的處理都是從s.dataTypes[1]開始的 if ( dataTypes[ 1 ] ) { for ( ; (current = dataTypes[++i]); ) { s.dataTypes.slice()只是對傳入參數的copy,方便后面使用 直接請有點繞,打個比方 比如,發送一個請求,要求是xml,返回的是text,那可以直接當xml(如果是text/html)或者用一個函數對text按xml的規範進行處理,返回一個xml對象給callback 如果是要求json,返回的是text,但是返回的是一個xml的text,那么就得先把text變成xml對象,再把xml變成json傳給callback 這中間可能的問題就來了,如果返回的是script的text,但要求的是json,你就沒得轉了,就會報錯
CodeSmallTiger 2014-02-28
  • 打赏
  • 举报
回复
引用 2 楼 danica7773 的回复:
ajax發送請求,當有數據返回時,對數據進行分析,根據要求的數據類型進行篩選匹配,如果有則返回處理過的數據,否則返回錯誤
那么 第一个参数s是什么 s.dataTypes 又是什么 s.dataTypes.slice(),为什么没有start 和 end位置?
CodeSmallTiger 2014-02-28
  • 打赏
  • 举报
回复
引用 1 楼 microlab2009 的回复:
根据函数名ajaxConvert理解 估计是一个ajax之后对值进行json转换的 Chain conversions given the request and the original response翻译: 将给出的请求和原始响应进行链式转换 我英文也不好 不知道对不对
谢谢 按你的翻译来读 我明白多了
打字员 2014-02-28
  • 打赏
  • 举报
回复
ajax發送請求,當有數據返回時,對數據進行分析,根據要求的數據類型進行篩選匹配,如果有則返回處理過的數據,否則返回錯誤
嘻哈大咖秀 2014-02-28
  • 打赏
  • 举报
回复
根据函数名ajaxConvert理解 估计是一个ajax之后对值进行json转换的 Chain conversions given the request and the original response翻译: 将给出的请求和原始响应进行链式转换 我英文也不好 不知道对不对

87,909

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧