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 № 1Problem 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.