Firefox 3.6.6 和 4.0 beta 1 中的 jQuery 自定义事件和过多递归错误

标签 jquery events recursion triggers

我收到“太多递归”错误。我将尝试对发生此问题的实际应用程序进行清晰的模拟。

假设该应用程序正在尝试调用网络服务来获取有关超长 cargo 列车内容的信息。信息如此之多,我们不能简单地调用 Web 服务并告诉它一次性发送整列火车中每节车厢的所有信息。相反,我们依次向网络服务询问每辆货车的信息,当收到有关单个货车的信息时,我们更新页面,然后询问下一辆车。

为了保持客户端响应,我们避免循环并使用带有 array.shift() 的事件:

我们有一个事件:

$('body').bind('NextBoxCar', function( e,  p) { getNexBoxCar(e,p);  });

我们有一个函数可以从数组中删除第一个 boxcarid 并将其发送到网络服务:

 EDIT: BoxCarIds is not a global but inside a function
 function() foo {
     var BoxCarIds = [123, 222, 767, 1234, 9298, ...  999];
     $('body').triggerHandler('NextBoxCar', BoxCarIds);
 }

 function getNextBoxCar(e, BoxCarIds) {      

   var id =  BoxCarIds.shift();

   // build an ajax request; omitted for brevity
     $.ajax( {
    .
    . <snip>
    .
     success:  function(data, textStatus, oHTTP ) {
        UpdatePage(data, BoxCarIds);
     }
   });

 }

当 Boxcar 的数据从 Web 服务返回时,ajax 成功处理程序会调用以下函数,该函数会更新页面,然后触发 NextBoxCar 事件。我相信这就是递归问题发生的地方。

 function UpdatePage(data, BoxCarIds) {

     // update the page with data
      .
      . <snip>
      .

     // if there are still ids remaining in the array, we need to call the webservice again by firing the event

     if (BoxCarIds.length > 0 ) {
       $('body').triggerHandler('NextBoxCar', BoxCarIds);

     }


 }

如何避免递归问题?

谢谢

最佳答案

这里的递归部分对于功能来说并不重要。这只是 ajax 调用的结果。您可以使 ajax 调用同步并将 getNextBoxCar 更改为循环。但是,这仍然会使页面无响应!

因此,我认为您可以通过使用 setTimeout 调用 UpdatePage 方法来解决该问题。这应该会破坏递归并使页面保持响应。请参阅this jsFiddle example .

尝试更改为:

// build an ajax request; omitted for brevity
$.ajax( {
    .
    . <snip>
    .
    success:  function(data, textStatus, oHTTP ) {
        setTimeout( function() {
            UpdatePage(data, BoxCarIds);
        }, 0);
    }
});

关于Firefox 3.6.6 和 4.0 beta 1 中的 jQuery 自定义事件和过多递归错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3221219/

相关文章:

javascript - 哪些 jQuery UI 模块是 animate 正常工作所必需的?

c# - WPF 相当于 Winform 的 KeyEventArgs - 使用特定键调用 KeyDown 事件

c# - .NET 自定义事件组织帮助

计算有序和无序排列 - C

javascript - JavaScript 中的逻辑运算符及其行为

javascript - google.load 正在加载导致版本控制问题的旧版本 jquery

c# - Asp.NET 服务器控件回发

PHP递归文件夹扫描到多数组(子文件夹和文件)

Python - 以深度优先顺序使用生成器迭代树

javascript - 如何使用 jQuery 将类添加到 Accordion 中的事件选项卡?