【问题标题】:JSON.parse causes Chrome tab to crash ("Aw, Snap") despite use of try/catchJSON.parse 导致 Chrome 选项卡崩溃(“Aw,Snap”),尽管使用了 try/catch
【发布时间】:2013-02-15 16:58:00
【问题描述】:

我正在从 AJAX 查询中加载一些 JSON 数据:

       $.ajax({'url': url, type: params.method, 'data': data, timeout: this.settings.timeout, success: function(d,a,x){
                console.log('request Complete',params.endpoint,params.params);
                var json = null;
                try {
                    json = JSON.parse(d);
                } catch(e) {
                    console.error(e);
                }
                console.log('json');

                // omitted for brevity...
            }
        });

我在 chrome 中看到偶尔的“Aw,Snap”崩溃,其中最后一个 console.log 是“请求完成”(错误或第二个日志永远不会显示)。

我想重要的是要注意数据可能很大(有时大到 ~15Mb),这就是为什么我没有在每个请求上打印出 d 并寻找格式错误的 JSON(但...我可能会导致)。 FWIW,我也试过 $.parseJSON 而不是 JSON.parse

我对“Aw, Snap”错误的研究充其量是模糊的。我最好的猜测是这是一个OOM。不幸的是,我无法减少结果集的占用空间。

有什么方法可以让我至少优雅地失败?

【问题讨论】:

  • JSON.parse 中的 OOM 至少不会导致崩溃。
  • "...数据可能很大(有时大到 ~15Mb)" 可能是您的问题。 try/catch 对此无济于事。

标签: javascript jquery ajax json google-chrome


【解决方案1】:

当你通过dataType 属性告诉jQuery 响应数据是JSON 时会发生什么?这样做应该会导致 jQuery 预解析并只给你数据。如果您对正在发生的事情是正确的,那么这似乎也可能导致崩溃。不过,jQuery 在解析之前会进行一些完整性检查。

$.ajax({
    url: url,
    type: params.method,
    data: data,
    dataType: 'json',
    timeout: this.settings.timeout,
    success: function (d, a, x){
        // `d` should already be parsed into an object or array, and ready to use
    }
});

如果这没有帮助,请发布您的实际 JSON 响应以供我们查看。

【讨论】:

  • 我没有考虑过 jQuery 解析可能会执行额外的检查;我会试试这个,看看问题是否得到解决(可能需要一些时间才能确定)。
【解决方案2】:

“@the system”成功了。返回的 15MB 信息对于您的浏览器来说太多了。我在试图了解为什么我的 64 字节编码图像字符串会导致 chrome 选项卡崩溃时绊倒了,而且它只有 200-500KB。

要“优雅地失败”,您似乎需要有适当的服务器端逻辑来防止这种情况发生;可能会限制 JSON 字符串的大小。初始 JSON 字符串中只有 X 个长度的字符,并为 'isFinishedSending: false' 或 'leftOff: [index/some marker]' 添加一个属性,这样你就可以暂停一段时间,然后用你离开的地方再次访问你的服务器关闭。

【讨论】:

  • 这看起来可能更适合作为评论而不是作为答案发布。
  • 它应该......我没有代表评论......愚蠢的愚蠢系统。有点迎合让我创造一些不是真正问题的问题,只是为了让别人回答
猜你喜欢
  • 2019-11-01
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
相关资源
最近更新 更多