我正在使用YUI团队提供的略微修改的示例代码。当我的源代码响应JSON以外的其他内容(或者只是出现JSON语法错误)时,我的浏览器(Safari)会中止脚本处理,从而阻止我通知用户存在问题。
我绝对不是JS大师,所以这段代码可能比它更加丑陋。代码大致是:
YUI().use("dump", "node", "datasource-get", "datasource-jsonschema", function(Y) {
var myDataSource = new Y.DataSource.Get({
source:"/some/json/source/?"}),
myCallback = {
success: function(e){
myResponse = e.response;
doSomething(myDataSource);
},
failure: function(e){
Y.get("#errors").setContent("<li>Could not retrieve data: " + e.error.message + "</li>");
}
};
myDataSource.plug(Y.Plugin.DataSourceJSONSchema, {
schema: {
resultListLocator: "blah.list",
resultFields: ["user", "nickname"]
}
});
myDataSource.sendRequest("foo=bar", myCallback);
}
我尝试在try / catch中包装“var myDataSource”块,我也尝试包装整个YUI()。use()块。
是否可以捕获语法错误?我是否必须使用单独的IO替换一体化DataSource.Get调用并解析调用?
答案 0 :(得分:1)
问题可能是在YUI甚至有机会报告失败之前,错误发生在浏览器的某个级别(Javascript解析)。
很难在Safari中捕获这种错误,因为它没有实现window.onerror。为了用我的Javascript library, bezen.org捕获更多错误,我在触发异步代码的地方添加了try / catch:
您可能有兴趣查看相应模块的源代码,这可能对您有用或作为解决问题的提示:
答案 1 :(得分:1)
由于您要请求本地脚本,您可以在try / catch或Y.DataSource.IO + Y.DataSchema.JSON(+ Y.JSON)中使用Y.io + Y.JSON.parse。
DataSource.Get的好处是它避免了同源策略。但是,它不太安全且灵活性较差。如果没有必要,你应该避免使用它。
DataSource.Get的合同是服务器支持JSONP。这种方式的工作方式是Get将一个脚本节点添加到页面中,其中src =(您提供的URL)&amp; callback = someDataSourceFunction。
浏览器将在该URL请求资源,并且会发生以下两种情况之一:
在任何一种情况下,该字符串都被视为脚本节点的内容 - 它被解析并执行。如果无法解析,浏览器将抛出错误。没有阻止这一点。虽然JSONP在技术上不受真正JSON的规范约束(即使是无效的JSON应该解析和执行),但是你应该总是使用纯JSON,并且总是使用服务器端lib来生成JSON输出(在http://json.org上查找每种可能的语言中的库列表)。不要手动滚动JSON。它只会导致数小时的调试。
答案 2 :(得分:0)
也许在“doSomething”之前尝试这个:
try
{
var test = YAHOO.lang.JSON.parse(jsonString);
...
}
catch (e)
{
alert('invalid json');
}