> 백엔드 개발 > PHP 튜토리얼 > javascript - js 재귀 함수가 500회 이상 실행된 후 스택 오버플로 오류를 보고합니까?

javascript - js 재귀 함수가 500회 이상 실행된 후 스택 오버플로 오류를 보고합니까?

WBOY
풀어 주다: 2016-09-19 09:16:34
원래의
1276명이 탐색했습니다.

1. PHP 개발에는 1700개 이상의 xml 파일 데이터를 읽어서 데이터베이스에 저장해야 합니다. 내 방법은 프런트 엔드에서 js 함수 재귀를 사용하고 AJAX를 통해 한 번에 하나씩 제출하는 것입니다. 현재 문제는 js의 재귀 함수가 500번 정도 실행되고, 브라우저가 스택 오버플로 오류를 보고하고 실행을 중지한다는 것입니다.
2. 프론트엔드 재귀 함수:
update_hotelInfo_queue(data,i)

<code>    {
        if(i==(data.length-1))
        {
            return;
        }
        $("#processInfo").html("正在处理第"+(i+1)+"个城市数据<br>");
        var url="__CONTROLLER__/updateHotelInfo";
        var cityID=data[i];
        console.log(i+"==>"+cityID);
        $.ajax({
            url:url,
            cache:false,
            async:false,
            dataType:"json",
            type:"POST",
            data:{cityID:cityID},
            success:function()
            {
                update_hotelInfo_queue(data,i+1)
            }

        })
    }
    </code>
로그인 후 복사
로그인 후 복사

3. 브라우저가 현재 재귀를 무한 루프로 판단하여 발생하는 오류인가요?
4. 보충 오류 정보
javascript - js 재귀 함수가 500회 이상 실행된 후 스택 오버플로 오류를 보고합니까?

JS초보자 조언 부탁드려요~~

답글 내용:

1. PHP 개발에는 1700개 이상의 xml 파일 데이터를 읽어서 데이터베이스에 저장해야 합니다. 내 방법은 프런트 엔드에서 js 함수 재귀를 사용하고 AJAX를 통해 한 번에 하나씩 제출하는 것입니다. 현재 문제는 js의 재귀 함수가 500번 정도 실행되고, 브라우저가 스택 오버플로 오류를 보고하고 실행을 중지한다는 것입니다.
2. 프론트엔드 재귀 함수:
update_hotelInfo_queue(data,i)

<code>    {
        if(i==(data.length-1))
        {
            return;
        }
        $("#processInfo").html("正在处理第"+(i+1)+"个城市数据<br>");
        var url="__CONTROLLER__/updateHotelInfo";
        var cityID=data[i];
        console.log(i+"==>"+cityID);
        $.ajax({
            url:url,
            cache:false,
            async:false,
            dataType:"json",
            type:"POST",
            data:{cityID:cityID},
            success:function()
            {
                update_hotelInfo_queue(data,i+1)
            }

        })
    }
    </code>
로그인 후 복사
로그인 후 복사

3. 브라우저가 현재 재귀를 무한 루프로 판단하여 발생하는 오류인가요?
4. 보충 오류 정보
javascript - js 재귀 함수가 500회 이상 실행된 후 스택 오버플로 오류를 보고합니까?

JS초보자 조언 부탁드려요~~

"테일콜 최적화" http://www.ruanyifeng.com/blo...

재귀 함수의 장점은 코드를 간결하게 만들고 더 적은 코드로 더 많은 일을 할 수 있다는 점입니다.

그러나 한 가지 큰 단점은 함수가 호출될 때마다 进栈이라고 하는 메모리의 일부가 소비된다는 것을 알고 있습니다. >.出栈

재귀 함수가 반복될 때마다 다음 재귀의 결과에 따라 출력될 수 있습니다. 이런 방식으로 함수는 항상 스택에서 튀어나오지 않고 스택에 푸시되며, 메모리는 항상 점유되어 제 시간에 석방되지 않았습니다.

따라서 오류 보고는 타당합니다. 스택 오버플로는 스택 오버플로로 해석됩니다.

해결 방법은 간단합니다. 루프를 사용하는 것이 좋습니다. 그러면 루프가 실행될 때마다 누구에게도 의존하지 않고 메모리가 자동으로 해제됩니다.

재귀 꼬리 호출을 구현하기 위해 재귀 알고리즘을 조정

재귀가 전혀 필요하지 않습니다. 루프를 사용하세요. 꼬리 재귀는 js에 쓸모가 없으며 최적화되지 않은 것 같습니다.

Ajax의 종속성 콜백은 promise-deferd를 사용해야 하는데, 데이터가 1,700개가 넘습니다. 이 방법을 사용하시겠습니까?

재귀라는 이전 방법을 사용하는 경우 일괄적으로 수행할 수 있는지 확인하세요.

루프를 사용할 수 있는 곳에 재귀를 사용하지 마세요. 재귀는 하노이탑과 같은 문제를 해결하기 위해 루프 알고리즘을 사용하는 경우를 해결하는 데 사용됩니다. 재귀의 가격은 stackoverflow입니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿