dojo xhr 请求新语法未按预期加载数据
dojo xhr request new syntax doesn't load data as expected
正如标题所说,我正在为 dojo/request/xhr 使用新的 dojo 语法,但这似乎不起作用,并且在加载数据时抛出错误具有相同 url 的旧语法给出了想要的结果。
这是不能正确加载数据的当前语法:
this.get = function (url, loadFunc, errorFunc, handleFunc) {
xhr( url, {
handleAs: 'json'
}).then(function(data){
typeof loadFunc === 'function' ? loadFunc : function () { };
console.log(url+ " load");
console.log(data);
}, function(error){
typeof errorFunc === 'function' ? errorFunc : function () { };
console.log(url+" error");
console.dir(error);
}, function(handle){
typeof handleFunc === 'function' ? handleFunc : function () { };
console.log(url+" handle");
console.log(handle);
});
};
如您所见,我正在将数据打印到控制台,我得到了正确的数据,但 xhr 请求抛出此错误:
"SyntaxError: Unexpected token o
at Object.parse (native)
at l.json (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:228:250)
at m (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:227:277)
at j [as handleResponse] (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:151:351)
at XMLHttpRequest.e (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:154:393)"
虽然以下旧语法可以完美运行:
this.get = function (url, loadFunc, errorFunc, handleFunc) {
dojo.xhrGet({
url: url,
handleAs: 'json',
load: typeof loadFunc === 'function' ? loadFunc : function () { },
error: typeof errorFunc === 'function' ? errorFunc : function () { },
handle: typeof handleFunc === 'function' ? handleFunc : function () { }
});
};
编辑:
这是我的 JSON 数据:
{ "assistants" : [ { "assistants" : [ "M 11",
"M 1"
],
"name" : "M X1"
},
{ "assistants" : [ "M 2",
"M 2XX1",
"M 3"
],
"name" : "M 1"
},
{ "assistants" : [ "M 2" ],
"name" : "M 2"
},
{ "assistants" : [ ],
"name" : "M 3"
}
],
"chiefs" : [ { "chief" : "M X1",
"name" : "M 11"
},
{ "chief" : "M 11",
"name" : "M 1"
},
{ "chief" : "M X1",
"name" : "M 2"
},
{ "chief" : "M 744X1",
"name" : "M 3"
}
],
"departments" : [ { "assistants" : [ "M 11",
"M 3",
"M 21"
],
"chief" : "M X1",
"email" : "dg@somedomain.com",
"interim" : [ "M X542",
"M 4"
],
"members" : [ "M 2",
"M 3",
"M 4",
"M 5",
"M X24544"
],
"name" : "Dep1",
"notify" : [ "Dep2",
"M X2",
"M 21"
],
"resp" : "M 21",
"validators" : [ "Dep2",
"M 2",
"M 558"
]
},
{ "chief" : "M 1",
"email" : "admin@somedomain.com",
"members" : [ "M 11",
"M 12"
],
"name" : "Dep3",
"parent" : "Dep1"
},
{ "chief" : "M 11",
"email" : "commercial@somedomain.com",
"members" : [ "M 21",
"M 22"
],
"name" : "Dep4",
"parent" : "Dep1"
}
],
"orgaTestModel" : { "corporation" : "Corporation Sample",
"name" : "Orga Sample 7855"
},
"root" : "Dep1"
}
注:
我正在使用 dojo 1.8.1
版本,但我也用 dojo 1.9.2
测试过它,但它仍然不起作用。
我不知道是什么问题。是我的代码有问题还是其他问题?
如有任何帮助,我们将不胜感激。
您没有提供原始 JSON 响应的示例,但我猜它是无效的 JSON。
当 handleAs
设置为 "json"
时,dojo.xhrGet
实际上使用 eval
,这根据定义比严格的 JSON 解析器更宽松。 dojo/request
,另一方面,如果可用,则使用 JSON.parse
,它期望 JSON 格式正确(例如,所有键都是带引号的字符串,所有字符串都使用双引号)。
尝试将您的 JSON 回复之一粘贴到 http://jsonlint.org/ - 如果它没有在那里验证,那么它将不会通过 dojo/request
.
验证
(dojo.xhrGet
使用 eval
的原因是它是在广泛 JSON.parse
支持之前编写的,即使它可能不安全,并且更改它会破坏向后兼容性 -换句话说,即使不切换 API,开发人员也会 运行 解决您现在 运行 遇到的问题。)
编辑:问题中提供的JSON现在有效,并且适用于新旧API。
正如标题所说,我正在为 dojo/request/xhr 使用新的 dojo 语法,但这似乎不起作用,并且在加载数据时抛出错误具有相同 url 的旧语法给出了想要的结果。
这是不能正确加载数据的当前语法:
this.get = function (url, loadFunc, errorFunc, handleFunc) {
xhr( url, {
handleAs: 'json'
}).then(function(data){
typeof loadFunc === 'function' ? loadFunc : function () { };
console.log(url+ " load");
console.log(data);
}, function(error){
typeof errorFunc === 'function' ? errorFunc : function () { };
console.log(url+" error");
console.dir(error);
}, function(handle){
typeof handleFunc === 'function' ? handleFunc : function () { };
console.log(url+" handle");
console.log(handle);
});
};
如您所见,我正在将数据打印到控制台,我得到了正确的数据,但 xhr 请求抛出此错误:
"SyntaxError: Unexpected token o at Object.parse (native) at l.json (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:228:250) at m (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:227:277) at j [as handleResponse] (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:151:351) at XMLHttpRequest.e (http://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js:154:393)"
虽然以下旧语法可以完美运行:
this.get = function (url, loadFunc, errorFunc, handleFunc) {
dojo.xhrGet({
url: url,
handleAs: 'json',
load: typeof loadFunc === 'function' ? loadFunc : function () { },
error: typeof errorFunc === 'function' ? errorFunc : function () { },
handle: typeof handleFunc === 'function' ? handleFunc : function () { }
});
};
编辑:
这是我的 JSON 数据:
{ "assistants" : [ { "assistants" : [ "M 11",
"M 1"
],
"name" : "M X1"
},
{ "assistants" : [ "M 2",
"M 2XX1",
"M 3"
],
"name" : "M 1"
},
{ "assistants" : [ "M 2" ],
"name" : "M 2"
},
{ "assistants" : [ ],
"name" : "M 3"
}
],
"chiefs" : [ { "chief" : "M X1",
"name" : "M 11"
},
{ "chief" : "M 11",
"name" : "M 1"
},
{ "chief" : "M X1",
"name" : "M 2"
},
{ "chief" : "M 744X1",
"name" : "M 3"
}
],
"departments" : [ { "assistants" : [ "M 11",
"M 3",
"M 21"
],
"chief" : "M X1",
"email" : "dg@somedomain.com",
"interim" : [ "M X542",
"M 4"
],
"members" : [ "M 2",
"M 3",
"M 4",
"M 5",
"M X24544"
],
"name" : "Dep1",
"notify" : [ "Dep2",
"M X2",
"M 21"
],
"resp" : "M 21",
"validators" : [ "Dep2",
"M 2",
"M 558"
]
},
{ "chief" : "M 1",
"email" : "admin@somedomain.com",
"members" : [ "M 11",
"M 12"
],
"name" : "Dep3",
"parent" : "Dep1"
},
{ "chief" : "M 11",
"email" : "commercial@somedomain.com",
"members" : [ "M 21",
"M 22"
],
"name" : "Dep4",
"parent" : "Dep1"
}
],
"orgaTestModel" : { "corporation" : "Corporation Sample",
"name" : "Orga Sample 7855"
},
"root" : "Dep1"
}
注:
我正在使用 dojo 1.8.1
版本,但我也用 dojo 1.9.2
测试过它,但它仍然不起作用。
我不知道是什么问题。是我的代码有问题还是其他问题?
如有任何帮助,我们将不胜感激。
您没有提供原始 JSON 响应的示例,但我猜它是无效的 JSON。
当handleAs
设置为 "json"
时,dojo.xhrGet
实际上使用 eval
,这根据定义比严格的 JSON 解析器更宽松。 dojo/request
,另一方面,如果可用,则使用 JSON.parse
,它期望 JSON 格式正确(例如,所有键都是带引号的字符串,所有字符串都使用双引号)。
尝试将您的 JSON 回复之一粘贴到 http://jsonlint.org/ - 如果它没有在那里验证,那么它将不会通过 dojo/request
.
(dojo.xhrGet
使用 eval
的原因是它是在广泛 JSON.parse
支持之前编写的,即使它可能不安全,并且更改它会破坏向后兼容性 -换句话说,即使不切换 API,开发人员也会 运行 解决您现在 运行 遇到的问题。)
编辑:问题中提供的JSON现在有效,并且适用于新旧API。