[回到版面]
回應模式
名 稱
內 文
附加圖檔[] []
  • 可附加圖檔類型:GIF, JPG, JPEG, PNG, WEBM,瀏覽器才能正常附加圖檔
  • 附加圖檔最大上傳資料量為 3072 KB。
  • 當檔案超過寬 125 像素、高 125 像素時會自動縮小尺寸顯示
  • 目前附加圖檔使用量大小: 148151 KB / 500000 KB
  • 回覆時程式碼縮排會被trim消掉,請善用[code][/code]標色或貼到ideone等網站
  • LaTeX記法可以用「$$」或「\( \)」包起來,例如「$\sum_{k=1}^{k=n} k^2 = \frac{n(n+1)(n+2)}{6}$」
  • 投稿時請點擊畫像認證後,再按下 [送出] 按鈕提交。
  • 鬧板、攻擊性發言、煽動性發言請無視(回應者也無視),並使用del或在貓管理部向管理員回報。
  • 新介面尚處於測試階段,如果有任何問題可以向管理員或於程設交流版反映。

檔名:1538987787202.jpg-(449 KB, 1024x686)
449 KB
JS的recursion問題無名18/10/08(一)16:36:27 ID:X3LvBOVQNo.12890
最近公司因為客戶資料不想一筆一筆Key,所以要我
寫一個能夠自動讀取JSON送出API請求的資料。
針對此需求我寫了一個小頁面回應。目前東西都好了但其中
有一部分讓我有點擔心:

一開始是用迴圈JSON每筆資料送一個ajax,但是發現這樣伺服器會受不了。
所以後來改成如下寫法:

  var successCount=0;
var datas=[{},{},{}]//一堆資料,大概三十到五十個
function upload_data(index){
$.ajax({
"data":data[index]
"success":onsuccess,
"error":onerror
});
function onsuccess(){
successCount+=1;
//更新畫面顯示
if(index+1 <datas.length){
upload_data(index+1);
}
}

function onerror(){
if(index+1 <datas.length){
upload_data(index+1);
}
}


}


想問這樣的寫法是否會構成 recursion ? 如果要upload的資料數量增加
到破百迫遷是否會導致stack overflow之類的問題。
無名18/10/09(二)00:19:57 ID:UaeI.PUENo.12892
>>12890
>是否會構成 recursion ?
肯定的

你解決伺服器承受的方式,最主要是一次傳多筆資料,而不是寫了遞迴
既然可以用迴圈的方式跑完全部資料,何必寫遞迴呢?
無名18/10/09(二)10:24:44 ID:tfzWFxcANo.12893
>>你解決伺服器承受的方式,最主要是一次傳多筆資料,而不是寫了遞迴

這主要是寫個小工具讓自己人輕鬆。正常使用情況沒有這項。
也不可能為此去修改伺服器(更何況伺服器軟體是用別人的產品,
想改也沒得改)。

>>既然可以用迴圈的方式跑完全部資料,何必寫遞迴呢?

主要是不知道該如何在迴圈的情況下確保ajax是做完第一個任務再做第二個任務。
沒這樣做的時候一微秒30~50個請求請求送出去直接炸掉。
無名18/10/09(二)16:23:34 ID:jaQJmWHwNo.12894
>>12890
如果用ES6 await語法 + fetch請求
就可以用迴圈並等待一筆資料傳完再傳下一筆
for (var i = 0; i < data.length; i++) {
await fetch(url, {body:JSON.stringify(data[i])});
}
有錯誤要處理的話用try catch包覆
無名18/10/12(五)17:06:48 ID:dYPgj5a2No.12895
>>12894

感謝。

暫時先相信現代電腦不會遞迴個1~200層就死掉。

不過async/fetch之類的東西對我目前的工作環境來說有點太新了。雖然沒有
IE8但是有FieFox ESR31/38的環境要顧。

不考慮相容性的畫是想用Promise來處理。應該也是ok的。
另外如果再 XmlHttpRequest的 onReadyStateChange中看到傳送完成後再次呼
叫 XmlHttpRequest.send是否一樣會構成recursion?
無名18/10/14(日)20:28:51 ID:dgKh2tysNo.12897
>>12895
有舊環境要顧的話可以用babel工具把ES6轉成ES5 + ES6 polyfill


【刪除文章】[]
刪除用密碼: