'requestAnimationFrame'으로 재귀 루프를 중지하는 방법

김치맨

다음과 같은 재귀 루프 기능이있는 클래스가 있습니다.

class Foo {
    private isLoopOnFlg: boolean = false;

    public StartLoop() {
        this.isLoopOnFlg = true;

        this.recursiveLoopWithDelay(() => {
            // Modifying DOM objects
        }, 1000);
    }

    public StopLoop() {
        this.isLoopOnFlg = false;
    }

    // THE PROBLEM
    private recursiveLoopWithDelay(loopFn: any, delay: number) {
        let stamp = Date.now();

        // How do I stop the loop using `isLoopOnFlg`?
        function _loop() {
            if (Date.now() - stamp >= delay) {
                loopFn();
                stamp = Date.now();
            }

            window.requestAnimationFrame(_loop);
        }

        window.requestAnimationFrame(_loop);
    }
}

보시다시피 함수 recursiveLoopWithDelay가 중지되지 않습니다. 새 개인 변수를 추가했고 isLoopOnFlg이를 사용하여 재귀 함수를 중지하고 싶습니다.하지만 어떻게해야할지 모르겠습니다. keepLoopFlg다음과 같이 함수에 새 매개 변수 추가하여 함수를 중지하려고했습니다 .

...
private recursiveLoopWithDelay(loopFn: any, delay: number) {
    let stamp = Date.now();

    // Added a new param `keepLoopFlg` but it's not changed when `StopLoop()` is called
    function _loop(keepLoopFlg: boolean) {
        if (keepLoopFlg && Date.now() - stamp >= delay) {
            loopFn();
            stamp = Date.now();
        }

        window.requestAnimationFrame(_loop.bind(this, this.isLoopOnFlg)); // Used `.bind(...)`
    }

    window.requestAnimationFrame(_loop.bind(this, this.isLoopOnFlg));
}
...

그러나 위의 코드는 내가 원하는대로하지 않습니다. StopLoop()호출 될 때 재귀 함수는 계속 진행됩니다 (메모리 누수). 현재 구조로 재귀 함수를 중지하고 메모리 누수를 방지하는 방법을 배우고 싶습니다. 저를 깨달으십시오!

Spidy

첫째, 콜백을 직접 호출하는 대신 이벤트 루프에서 콜백을 큐에 넣기 때문에 실제로 재귀 적이 지 않습니다. 따라서 호출 스택의 메모리 부족에 대해 걱정할 필요가 없습니다.

requestAnimationFrame 호출을 중지하려면 호출하지 마십시오. 문제는 언제 전화를 끊으시겠습니까? 다른 사람에게 유틸리티 기능을 제공하는 경우 일반적으로 업데이트를 "구독 취소"하거나 중지 할시기를 지정하게합니다.

private recursiveLoopWithDelay(loopFn: any, delay: number) {
    const self = this;
    let stamp = Date.now();

    function _loop() {
        // If we aren't looping anymore, just exit the code.
        // Don't requeue requestAnimationFrame
        if (!self.isLoopOn) {
            return;
        }

        if (Date.now() - stamp >= delay) {
            loopFn();
            stamp = Date.now();
        }

        window.requestAnimationFrame(_loop);
    }

    window.requestAnimationFrame(_loop);
}

여기에서 한 것처럼 Lexical 범위를 사용하여 바인딩을 건너 뛸 수도 있습니다. 언제든지 조회 할 수 this있는 변수에 저장 self합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

"for 루프"를 재귀 적으로 만드는 방법

분류에서Dev

이 재귀를 루프로 작성하는 방법

분류에서Dev

루프를 재귀로 다시 쓰는 방법

분류에서Dev

requestAnimationFrame 루프를 재정의하는 방법은 무엇입니까?

분류에서Dev

재귀 방식으로 시프트 레지스터를 작성하는 방법

분류에서Dev

객체 내부에서 재귀 적으로 루프하는 방법

분류에서Dev

URL 경로를 재귀 적으로 추출하는 방법

분류에서Dev

Clojure로 폴더를 재귀 적으로 압축하는 방법

분류에서Dev

WHILE 루프를 사용할 때 함수를 재귀 적으로 호출하고 제대로 중단하는 방법은 무엇입니까?

분류에서Dev

파이썬 객체를 재귀 적으로 jsonize하는 방법

분류에서Dev

재귀를 반복으로 변환하는 방법?

분류에서Dev

typedef를 재귀 적으로 사용하는 방법?

분류에서Dev

이 함수를 재귀 적으로 적용하는 방법

분류에서Dev

Linux-폴더를 재귀 적으로 chmod하는 방법?

분류에서Dev

a % b를 재귀 적으로 계산하는 방법?

분류에서Dev

이 코드를 재귀 형식으로 변경하는 방법

분류에서Dev

재귀 방식으로 메뉴를 만드는 방법 Angularjs

분류에서Dev

while 루프를 사용하여 프로그램을 재귀로 변환하는 방법은 무엇입니까?

분류에서Dev

루비에서 알려지지 않은 Proc를 재귀 적으로 전달하는 방법

분류에서Dev

프롤로그 재귀 깊이를 추적하는 방법?

분류에서Dev

인덱스를 조건으로 사용해야하는 경우 루프를 재귀로 수정하는 방법은 무엇입니까?

분류에서Dev

깊이 중첩 된 객체를 재귀 적으로 중첩 해제하는 방법은 무엇입니까?

분류에서Dev

JavaScript 객체의 루프 내에서 값을 재귀 적으로 집계하는 방법은 무엇입니까?

분류에서Dev

재귀 방법으로 가능한 모든 숫자를 찾는 방법

분류에서Dev

C에서 잠시 후 재귀를 중지하는 방법

분류에서Dev

findMatch를 재귀 적으로 호출하는 방법이 있습니까?

분류에서Dev

비동기 함수를 재귀 적으로 반환하는 방법

분류에서Dev

이 코드를 재귀에서 반복으로 변경하는 방법

분류에서Dev

재귀를 트램폴린으로 변환하는 방법 이해

Related 관련 기사

  1. 1

    "for 루프"를 재귀 적으로 만드는 방법

  2. 2

    이 재귀를 루프로 작성하는 방법

  3. 3

    루프를 재귀로 다시 쓰는 방법

  4. 4

    requestAnimationFrame 루프를 재정의하는 방법은 무엇입니까?

  5. 5

    재귀 방식으로 시프트 레지스터를 작성하는 방법

  6. 6

    객체 내부에서 재귀 적으로 루프하는 방법

  7. 7

    URL 경로를 재귀 적으로 추출하는 방법

  8. 8

    Clojure로 폴더를 재귀 적으로 압축하는 방법

  9. 9

    WHILE 루프를 사용할 때 함수를 재귀 적으로 호출하고 제대로 중단하는 방법은 무엇입니까?

  10. 10

    파이썬 객체를 재귀 적으로 jsonize하는 방법

  11. 11

    재귀를 반복으로 변환하는 방법?

  12. 12

    typedef를 재귀 적으로 사용하는 방법?

  13. 13

    이 함수를 재귀 적으로 적용하는 방법

  14. 14

    Linux-폴더를 재귀 적으로 chmod하는 방법?

  15. 15

    a % b를 재귀 적으로 계산하는 방법?

  16. 16

    이 코드를 재귀 형식으로 변경하는 방법

  17. 17

    재귀 방식으로 메뉴를 만드는 방법 Angularjs

  18. 18

    while 루프를 사용하여 프로그램을 재귀로 변환하는 방법은 무엇입니까?

  19. 19

    루비에서 알려지지 않은 Proc를 재귀 적으로 전달하는 방법

  20. 20

    프롤로그 재귀 깊이를 추적하는 방법?

  21. 21

    인덱스를 조건으로 사용해야하는 경우 루프를 재귀로 수정하는 방법은 무엇입니까?

  22. 22

    깊이 중첩 된 객체를 재귀 적으로 중첩 해제하는 방법은 무엇입니까?

  23. 23

    JavaScript 객체의 루프 내에서 값을 재귀 적으로 집계하는 방법은 무엇입니까?

  24. 24

    재귀 방법으로 가능한 모든 숫자를 찾는 방법

  25. 25

    C에서 잠시 후 재귀를 중지하는 방법

  26. 26

    findMatch를 재귀 적으로 호출하는 방법이 있습니까?

  27. 27

    비동기 함수를 재귀 적으로 반환하는 방법

  28. 28

    이 코드를 재귀에서 반복으로 변경하는 방법

  29. 29

    재귀를 트램폴린으로 변환하는 방법 이해

뜨겁다태그

보관