/ / Przekroczono maksymalny rozmiar stosu wywołań w funkcji rekurencyjnej SetTimeout (Javascript) [duplikat] - javascript, jquery, recursion, settimeout

Przekroczono maksymalny rozmiar stosu wywołań w funkcji rekurencyjnej SetTimeout (Javascript) [duplicate] - javascript, jquery, recursion, settimeout

Mam rekursywną funkcję SetTimeout, która klika filtr na mojej stronie po wczytaniu filtrów (są one ładowane przez Ajax, więc nie są dostępne natychmiast po wczytaniu strony).

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

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

Jednak gdy ładowanie filtrów zajmuje dużo czasu, pojawia się komunikat "Uncaught RangeError: Przekroczony maksymalny rozmiar stosu wywołań (...)"

Jak temu zapobiec i upewnić się, że działa aż do zakończenia?

Odpowiedzi:

2 dla odpowiedzi № 1

Problem jest tutaj:

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

Putting () po referencji funkcji oznacza, że ​​chcesz funkcję nazywa, natychmiast, w tym punkcie kodu. Zamiast tego prawdopodobnie chcesz coś takiego:

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

które będą

  • przekazać referencję do funkcji setTimeout(), zgodnie z wymaganiami, oraz
  • upewnij się, że funkcja zostanie wywołana za pomocą właściwej this wartość (co .bind() część robi)

Kiedy już to zrobisz, termin "rekursywny"Właściwie to nie jest odpowiednie.Tak, funkcja odwołuje się do siebie, gdy organizuje połączenie po upływie czasu, ale nie wywołuje bezpośrednio siebie; prosi o coś innego (mechanizm timera), aby zadzwonić później.