2016-12-01 115 views
0

我有一個遞歸SetTimeout函數,它在篩選器加載後(它們通過Ajax加載,因此在頁面加載時不會立即可用)單擊頁面上的篩選器。在SetTimeout遞歸函數(Javascript)上超出最大調用堆棧大小

$scope.clickFilter = function() { 
    var filter = $('.filter-item') 
     .find('input[value="' + $scope.activeFilter + '"]'); 

    if (filter.length < 1) { 
     setTimeout($scope.clickFilter(), 1000); 
    } else { 
     $(filter).trigger("click"); 
    } 
} 

然而,當過濾器需要很長的時間來加載,我得到「未捕獲的RangeError:最大調用堆棧大小超過(......)」

如何防止這種情況,並確保它運行直到完成?

回答

2

的問題是在這裏:

setTimeout($scope.clickFilter(), 1000); 

函數引用後把()意味着你想要的功能是稱爲,立即在代碼中的那個點。你可能就要什麼是一樣的東西:

setTimeout($scope.clickFilter.bind($scope), 1000); 

  • 傳遞一個函數引用setTimeout(),因爲是必需的,
  • 確保功能將與適當的this調用值(什麼是.bind()部分)

一旦你得到它的工作,術語「遞歸「並不合適。是的,函數在計時器到期後安排通話時引用自身,但不直接調用自身;它要求別的東西(定時器機制)稍後調用它。

+0

您知道嗎*這是重複的... :-) –

+0

@ T.J.Crowder早上有些時候我只是沒有處理奇怪的SO搜索。是的,這是一個課程。 – Pointy

相關問題