首頁 > 後端開發 > php教程 > javascript - js 遞歸函數,運行500多次後報Stack overflow錯誤?

javascript - js 遞歸函數,運行500多次後報Stack overflow錯誤?

WBOY
發布: 2016-09-19 09:16:34
原創
1271 人瀏覽過

1.PHP開發,有個需求,將1700多個xml檔案資料讀取後存入資料庫。我的方法是前端用js函數遞歸,透過AJAX一次一個提交。現在的問題是js的遞歸函數跑了大約500次左右,瀏覽器就報Stack overflow錯誤,停止運作了。
2.前端遞歸函數:
function 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多次後報Stack overflow錯誤?

js小白請教各位~~

回覆內容:

1.PHP開發,有個需求,將1700多個xml檔案資料讀取後存入資料庫。我的方法是前端用js函數遞歸,透過AJAX一次一個提交。現在的問題是js的遞歸函數跑了大約500次左右,瀏覽器就報Stack overflow錯誤,停止運作了。
2.前端遞歸函數:
function 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多次後報Stack overflow錯誤?

js小白請教各位~~

《尾調用優化》http://www.ruanyifeng.com/blo...

遞歸函數優點就是能使程式碼簡潔,用更少的程式碼做更多的事.

但是有個很大的缺點就是佔用內存, 我們知道,每次調用函數都會消耗一部分內存,叫進棧,函數執行完後,內存釋放,叫出棧.

遞歸函數每一次遞歸,都依賴於下次遞歸的結果才能輸出,這樣函數一直進棧,沒有出棧,內存一直被佔用,沒有及時釋放.

所以你的報錯也就理所當然了 stack overflow 翻譯過來就是棧溢出.

解決方法簡單,建議用循環,這樣每次循環,函數執行完不依賴誰就自動釋放內存

調整下遞歸的演算法,實現遞歸的尾呼叫

你這壓根不用遞歸,使用循環吧。尾遞歸對js沒用,又沒有優化好像。

ajax的依賴回呼需要使用promise-defferd,不過1700多條數據,你確定要用這個方法?

如果用你之前的方法也就是遞歸,看看能不能分批進行。

能用循環的地方就不要用遞歸。遞歸是用來解決一些用循環演算法是否否則的案例,例如漢諾塔這類問題。遞歸的代價就是stackoverflow。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板