为何jQuery.ajax中指定的dload转JSON转换器未被调用?
问题根源:转换器触发逻辑与
dataType配置不匹配 你遇到的问题核心在于jQuery的转换器只会朝着你指定的dataType方向完成转换链,而当前配置里dataType设为了dload,转换流程到这一步就终止了,根本不会触发'dload json'这个转换器。
拆解你的配置逻辑
'text dload': true:这个规则是把服务器返回的纯文本直接映射为dload类型,没有做任何额外处理'dload json': jQuery.parseJSON:这个转换器是用来把dload类型数据转成JSON,但因为你最终指定的目标类型是dload,jQuery没有理由继续往下执行转换
解决方案1:调整dataType为最终目标类型
如果你最终想要的是JSON格式数据,应该把dataType设为json,让转换器链完整执行:
$.ajax(url, { accepts: { dload: 'application/x-dload' }, contents: { dload: /dload/ }, converters: { 'text dload': true, 'dload json': jQuery.parseJSON }, // 把目标类型改成json,触发完整转换链 dataType: 'json', success: function( data, status, xhr ){ debugger; // 这里data就是解析后的JSON对象 $( container ).html( 'Done' ); success(); }, })
解决方案2:手动在回调中转换数据
如果坚持要保留dataType: 'dload',可以在success回调里手动调用JSON解析:
$.ajax(url, { accepts: { dload: 'application/x-dload' }, contents: { dload: /dload/ }, converters: { 'text dload': true }, dataType: 'dload', success: function( data, status, xhr ){ // 手动解析JSON const parsedData = jQuery.parseJSON(data); debugger; // 这里parsedData就是解析后的对象 $( container ).html( 'Done' ); success(); }, })
额外补充:jQuery转换器的工作逻辑
转换器本质是在「原始数据类型」和「目标dataType」之间建立转换链条。比如你指定dataType: 'json',jQuery会从服务器返回的Content-Type对应类型(比如text)开始,依次匹配转换器,直到转成目标类型为止。如果目标是中间类型(比如这里的dload),转换就会在该节点停止。
内容的提问来源于stack exchange,提问作者Eugen Konkov
相关产品推荐
相关产品推荐

