在大型数据集上使用Jquery / ajax / jasonresult时是否有超时?

时间:2011-12-06 22:50:24

标签: jquery json


***更新信息

我现在不相信这是一个超时问题。但是看到某些东西会产生服务器错误(“500”)。我已经测试了各种数据集,一旦大小超过某个阈值,就会调用ajaxError函数。服务器在数据库中查询数据行并将其转换为XML字符串。 db有一组多个表,用于创建递归构造的xml字符串。父表有2300行,子表有大约20000 - 所以字符串相当大。但是,如果我使用这样的代码,这个函数可以正常工作:

    <form id="theTax" method="post" action="ProcessTax" >
@{
    TaxonomyHelper th = new TaxonomyHelper(1);
    @Html.Raw(th.TaxonomyDivTag.ToString())        
 }
</form>

因此,在这种情况下,返回了大量的数据,而渲染(在客户端上递归完成)需要花费一分钟......它可以工作。我的目标是利用ajax并根据用户的需求进行分而治之(始终是此完整数据集的重要子集)。我唯一的好奇心就是为什么,当我使用ajax,jquery和json做同样的事情时,我是否会收到此服务器错误?更重要的是,在要求数据集大小太大而无法成功之前,我应该检查一些限制吗?

所以在今天的测试中,当我将该组细分为一些较小尺寸的限制时,我没有得到错误。它总是工作或不工作 - 好像它测量了服务器所说的电汇线路,并在达到规模限制时说“不”。我试过延迟,坐在断点和其他愚蠢的措施 - 我试图通过调整linq2sql查询来分割各种形式的2级xml节点...无论如何,它始终有效或始终不起作用。

所以现在的问题是:是否有人知道总数据大小限制从服务器调用什么回到“getJSON”调用?这似乎是正确的,因为成功与失败的相对大小似乎非常接近。我需要添加一些代码来测量大小,但如果有人知道这一点,那就更快了:)

再次感谢swags,但我现在确实相信这可能是有价值的,而不是我学习关于jquery,ajax以及如何拼写json的新内容;)


下面的代码片段是MVC3应用的一部分。由URL返回的JasonResult(名为“GetJson”的函数)返回显示在div标签中的html。名为“GetJason”的JasonResult函数返回相当少的字符 - 大约10K。 “GetJasonAll”是一个相当多的字符 - 超过100K。它们都是大分类法的效果图。

我试图找到为什么较小版本的JasonResult工作正常而另一个无法显示数据的原因。当使用jquery ajax功能时,我尝试过异步,同步和其他一些想法 - 但都无济于事。它似乎就像它超时一样。但我知道该函数正在从JasonResult控制器函数返回数据。但它似乎死在那里 - 好像浏览器会在说“继续”之前等待这么久。我已经逐步完成了jquery js,但似乎无法找出结果似乎无效的地方。

感谢任何帮助。请注意,如果我使用ActionResult并下拉更大的数据集,那么我对该页面没有任何问题。它只需要永远,我的策略是分裂和征服,因为我依赖于用户输入逐步打开一个递归列表。显然我可以在没有ajax的情况下往返,但这样会减少吸引力,我希望我在这里遗漏一些东西。

另外一些可能有用的信息:如果我在“processJSON”函数中放置一个“调试器”断点 - 小集合显然会触及它,但较大的集合不会。如果出现超时问题,这是有道理的。在任何一种情况下,都可以立即点击启动脚本的按钮。即,没有锁定等。

  • 感谢您的任何反馈。

脚本代码:

<script type="text/javascript">
$(document).ready(function () {

    $.ajaxSetup({ 'async': false });
    $('#someButton').click(function () {
        $.get('GetJson', function (data) {
            processJSON(data);
        });
    });

    function processJSON(data) {
        var output = data;
        $('#SomeDiv').html(output);
    }
});

两个.NET控制器功能:

        public JsonResult GetJson()
    {            
        JsonResult js = new JsonResult();
        TaxonomyHelper th = new TaxonomyHelper(1);
        js.Data =   "<script src='taxonomyRenderer.js' type='text/javascript'></script>" +
                    "<link href='taxonomyStyle.css' rel='stylesheet' type='text/css' />" +         
        th.TaxonomyDivTag.ToString();
        js.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        return js;
    }

    public JsonResult GetJsonAll()
    {
        JsonResult js = new JsonResult();
        TaxonomyHelper th = new TaxonomyHelper();
        js.Data = "<script src='taxonomyRenderer.js' type='text/javascript'></script>" +
                    "<link href='taxonomyStyle.css' rel='stylesheet' type='text/css' />" +
            th.TaxonomyDivTag.ToString();
        js.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        return js;
    }

2 个答案:

答案 0 :(得分:0)

没有$.get()超时。请参阅jQuery source,默认为0。

您可能会收到错误响应,但除非您将某些内容附加到错误处理程序,否则它会无声地失败。请参阅this post,了解如何连接$.get()错误处理程序。为了方便最终用户,jQuery擅长隐藏错误 - 不支持开发人员。

如果您知道要返回JSON,则还应使用$.getJSON()

答案 1 :(得分:0)

在JQuery中使用低级ajax接口而不是简写方法
: - http://api.jquery.com/jQuery.ajax/

  

超时号码
  设置请求的超时(以毫秒为单位)。这将覆盖使用$ .ajaxSetup()设置的任何全局超时。超时时间从$ .ajax调用点开始;如果其他几个请求正在进行且浏览器没有可用的连接,则请求可能会在发送之前超时。在jQuery 1.4.x及更低版本中,如果请求超时,XMLHttpRequest对象将处于无效状态;访问任何对象成员可能会抛出异常。仅在Firefox 3.0+中,超时无法取消脚本和JSONP请求;即使在超时时间之后到达,脚本也会运行。