2010-04-09 75 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