1

我正在从 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。不幸的是,我无法减少结果集的占用空间。

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

4

2 回答 2

2

当你通过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 响应以供我们查看。

于 2013-02-15T17:02:11.017 回答
0

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

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

于 2016-02-29T18:10:25.510 回答