2

我正在使用 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);
}

我尝试将“var myDataSource”块包装在 try/catch 中,并且我还尝试包装整个 YUI().use() 块。

是否可以捕获语法错误?我是否必须用单独的 IO 和解析调用替换一体化 DataSource.Get 调用?

4

3 回答 3

1

问题可能是在 YUI 甚至有机会报告失败之前,错误发生在浏览器中的某个级别(Javascript 解析)。

在没有实现 window.onerror 的 Safari 中很难捕捉到这种错误。为了在我的Javascript 库 bezen.org中捕获更多错误,我在触发异步代码的地方添加了 try/catch:

  • 动态脚本加载(相当于你的 JSON 下载)
  • setTimeout/setTimer:我包装并替换了这些浏览器函数以插入一个记录错误的 try/catch

您可能有兴趣查看相应模块的源代码,这可能对您有用或作为解决问题的提示:

于 2009-11-24T22:51:10.873 回答
1

由于您正在请求本地脚本,因此您可以在 try/catch 或 Y.DataSource.IO + Y.DataSchema.JSON (+ Y.JSON) 中使用 Y.io + Y.JSON.parse。

DataSource.Get 的好处是它避免了同源策略。但是,它的安全性和灵活性较差。如果没有必要,您应该避免使用它。

DataSource.Get 的约定是服务器支持 JSONP。其工作方式是 Get 使用 src=(您提供的 url)&callback=someDataSourceFunction 向页面添加一个脚本节点。

浏览器将在该 url 处请求资源,并且会发生以下两种情况之一:

  1. 服务器将以 someDataSourceFunction({"all":"your data"}); 形式的 JavaScript 字符串进行响应 或者
  2. 服务器将返回一些无法解析为 JavaScript 的文本。

在任何一种情况下,该字符串都被视为脚本节点的内容——它被解析并执行。如果无法解析,浏览器会抛出错误。这没有停止。虽然 JSONP 在技术上不受真正 JSON 的规范约束(即使是无效的 JSON 也应该解析和执行),但您应该始终使用纯 JSON,并始终使用服务器端库来生成 JSON 输出(查看http://json. org以获取每种可以想到的语言的库列表)。不要手动滚动 JSON。它只会导致数小时的调试。

于 2009-11-25T01:15:49.253 回答
0

也许在你“做某事”之前试试这个:

try
{
   var test = YAHOO.lang.JSON.parse(jsonString); 
   ...
}
catch (e)
{
   alert('invalid json');
}
于 2009-11-24T21:28:49.263 回答