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

來源:互聯網
上載者:User

1.PHP開發,有個需求,將1700多個xml檔案資料讀取後存入資料庫。我的方法是前端用js函數遞迴,通過AJAX一次一個提交。現在的問題是js的遞迴函式跑了大約500次左右,瀏覽器就報Stack overflow錯誤,停止運行了。
2.前端遞迴函式:
function update_hotelInfo_queue(data,i)

    {        if(i==(data.length-1))        {            return;        }        $("#processInfo").html("正在處理第"+(i+1)+"個城市資料
"); 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) } }) }

3.這個報錯是瀏覽器判斷當前的遞迴是個死迴圈?
4.補充報錯資訊

js小白請教各位~~

回複內容:

1.PHP開發,有個需求,將1700多個xml檔案資料讀取後存入資料庫。我的方法是前端用js函數遞迴,通過AJAX一次一個提交。現在的問題是js的遞迴函式跑了大約500次左右,瀏覽器就報Stack overflow錯誤,停止運行了。
2.前端遞迴函式:
function update_hotelInfo_queue(data,i)

    {        if(i==(data.length-1))        {            return;        }        $("#processInfo").html("正在處理第"+(i+1)+"個城市資料
"); 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) } }) }

3.這個報錯是瀏覽器判斷當前的遞迴是個死迴圈?
4.補充報錯資訊

js小白請教各位~~

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

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

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

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

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

解決方案簡單,建議用迴圈,這樣每次迴圈,函數執行完不依賴誰就自動釋放記憶體

調整下遞迴的演算法,實現遞迴的尾調用

你這壓根不用遞迴,使用迴圈吧。尾遞迴對js並沒用,又沒有最佳化好像。

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

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

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

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.