2010-04-09 76 views
2

为什么当我执行以下操作时会出现“太多的递归”错误?

function sendTheNames() { 

     alert("start submitting names.."); 

     return function (array) { 

      var name = $(array.shift()).text(); 

      $.ajax({ 
       url: "test.jsp?name=" + name, 
       complete: function() { 
        if (array.length > 0) { 
         return arguments.callee(array); 
        } 
       } 
      }); 
     }; 

    } 

    $(document).ready(function() { 

     var selectedNames = []; 
     $('ul li input:checked').each(function() { 
      selectedNames.push($(this).parent()); 
     }); 

     alert("begin"); 

     sendTheNames()(selectedNames); 

     alert("done"); 
    }); 
+3

有趣的问题,但这是一个非常奇怪的方式来编码它。普通循环不会更好吗?更好的是,POST请求? – deceze 2010-04-09 05:06:21

+0

@deceze,以上只是一个简单的代码。业务逻辑要求我将数据一个一个地异步提交给服务器(每个请求一个数据)。我不能按照你的建议将它作为一堆数组提交给POST请求,我必须等待提交完成才能提交另一个请求。你是否有更简单的方法来做到这一点,而没有递归? – 2010-04-09 07:12:06

回答

6

如果你绝对需要异步复发,分开的调用,至少做了一些简单的递归:

var selectedNames = ['Abe', 'Burt', 'Chris']; 

function sendNames() { 
    var name = selectedNames.shift(); 

    $.ajax({ 
     url: "test.jsp?name=" + name, 
     complete: function() { 
      if (selectedNames.length > 0) { 
       sendNames(); 
      } 
     } 
    }); 
} 

sendNames(); 
+0

仍是递归,但更具可读性。谢谢。 – 2010-04-09 10:16:40

2

因为arguments.callee在这方面是指complete: function() {...}

你递归没有得到任何更接近终端条件。从本质上讲

function complete() { 
    if (array.length > 0) { 
     return complete(array); 
    } 
} 

有它复发的一些其他功能,把这个要重现该函数内部:

var outerCallee = arguments.callee; 

,并使用

return outerCallee(array); 
+0

+1回答问题点,很有教育意义。现在我明白JavaScript越来越好了,这肯定会派上用场。我测试了你的解决方案,它的工作原理,但我接受愚蠢的答案,因为它更具可读性。 – 2010-04-09 09:57:14