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。