--
問題
1 2 3 4 5 6 7 8 9 10 11 12 |
let $q = []; $.each( $q, function(k,v){ const xhr = new XMLHttpRequest(); xhr.responseType = 'blob'; xhr.open("POST", '/download_word/' + v, true); xhr.onload = function (e) { let blob = e.currentTarget.response; if ( blob.size > 0 ) saveBlob(blob, 'word_'+ v + '.doc'); }; xhr.send(); } ); |
原來有一個陣列,使用裡面的資料非同步去取得資料並下載,因為非同步幾乎是同時,所以瀏覽器需要開啟同時下載多檔案權限,可是在數量多時會少檔案,F12 監控網路是全部的檔案都有訪問,可是下載的數量不對,這時就要把下載製造間隔變成單一、單一的檔案下載
網路上會抄到類似這樣的代碼 (What is the JavaScript version of sleep()?)
1 2 3 |
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } |
可惜對 Hoyo 的應用場景沒用,所以只能自己想辦法,後來想到也只能用 setInterval()
--
解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 負責下載 function run(filename, url, v){ if ( v !== undefined ) { const xhr = new XMLHttpRequest(); xhr.responseType = 'blob'; xhr.open("POST", url + v, true); xhr.onload = function (e) { let blob = e.currentTarget.response; if (blob.size > 0) saveBlob(blob, filename + v + '.doc'); }; xhr.send(); } } // 處理資料 分割時序 function download_word(){ let $q = explode(',', $('#id_form').find('[name="subject"]').val()); let i = 0; let $int = setInterval(function(){ if ( $q[i]===undefined ) clearInterval($int); run('word_', '/download_word/', $q[i]); i++; }, 250); } |
- 原來的資料陣列使用 setInterval() 輪詢,沒資料時就 clearInterval() 刪除
- 然後下載就獨立出來
--
1,910 total views, 1 views today