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.補充報錯資料
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.補充報錯資料
js小白請教各位~~
《尾調用優化》http://www.ruanyifeng.com/blo...
遞歸函數優點就是能使程式碼簡潔,用更少的程式碼做更多的事.
但是有個很大的缺點就是佔用內存, 我們知道,每次調用函數都會消耗一部分內存,叫進棧
,函數執行完後,內存釋放,叫出棧
.
遞歸函數每一次遞歸,都依賴於下次遞歸的結果才能輸出,這樣函數一直進棧,沒有出棧,內存一直被佔用,沒有及時釋放.
所以你的報錯也就理所當然了 stack overflow 翻譯過來就是棧溢出.
解決方法簡單,建議用循環,這樣每次循環,函數執行完不依賴誰就自動釋放內存
調整下遞歸的演算法,實現遞歸的尾呼叫
你這壓根不用遞歸,使用循環吧。尾遞歸對js沒用,又沒有優化好像。
ajax的依賴回呼需要使用promise-defferd,不過1700多條數據,你確定要用這個方法?
如果用你之前的方法也就是遞歸,看看能不能分批進行。
能用循環的地方就不要用遞歸。遞歸是用來解決一些用循環演算法是否否則的案例,例如漢諾塔這類問題。遞歸的代價就是stackoverflow。