Javascript, spliced FileReader for large files with Promises, how?
我正在尝试使用FileReader来使用诺言顺序读取多个文件。问题是我需要将读取操作分成几部分以使其可行。这样,我失去了Promise链。这就是下面的代码中发生的情况,在该代码中,我获得了控制台日志
这是代码(请转到最后的EDIT,尽管如此,我仍然保留原始文本)
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 27 28 29 30 31 32 33 34 35 36 37 | var reader = new FileReader(); reader.onloadend = function(e) { if (e.target.readyState == 2) { console.log('inside') start = temp_end; temp_end = start + BYTES_PER_CHUNK; if (temp_end > end) temp_end = end; upload(); } }; Array.reduce(function(promise, item) { start = 0; temp_end = start + BYTES_PER_CHUNK; end = parseInt(totalsize); if (temp_end > end) temp_end = end; uploading_file = item; return upload() .then(function(){ console.log('not shown'); }) .catch(console.log('catched')); },0); function upload() { return new Promise(function(resolve,reject) { if (start < end) { console.log('here') var chunk = uploading_file.slice(start, temp_end); reader.readAsBinaryString(chunk); } else { console.log('finished') uploading_file = null; resolve(); } } } |
EDIT1:我正在尝试的新代码,console.log
之前
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 27 28 29 30 31 32 33 34 | var start = 0; var temp_end = start + BYTES_PER_CHUNK; var end = parseInt(item.size); if (temp_end > end) temp_end = end; uploading_file = item; console.log('here 1') Promise.resolve().then(function() { return upload(); }) .then(function(){ console.log('here 2') }) .catch(console.log('stop 1')); function upload() { console.log('upload') if (start < end) { var chunk = uploading_file.slice(start, temp_end); var reader = new FileReader(); reader.readAsArrayBuffer(chunk); reader.onload = function(e) { if (e.target.readyState == 2) { start = temp_end; temp_end = start + BYTES_PER_CHUNK; if (temp_end > end) temp_end = end; return upload(); } } } else { console.log('finished') uploading_file = null; return Promise.resolve(); } } |
EDIT2:由于缺少function(),捕获日志在那里。以下代码似乎有效,但最后看不到我感兴趣的值
问题是,confirm.log说,
确实在这里没有兑现Promise。
1 2 3 4 | here 1 here 2 here 4 here 3 |
代码:
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | var item; // item is a file var BYTES_PER_CHUNK = 100000; var start = 0; var temp_end = start + BYTES_PER_CHUNK; var end = parseInt(item.size); if (temp_end > end) temp_end = end; var content = ''; // to be filled by the content of the file var uploading_file = item; console.log('here 1'); Promise.resolve().then(function() { console.log('here 2'); return upload(); }) .then(function(content){ console.log('here 4'); console.log(content); // this is empty (!!) }) .catch(function(){ console.log('stop 1') }); function upload() { if (start < end) { var chunk = uploading_file.slice(start, temp_end); var reader = new FileReader(); reader.readAsArrayBuffer(chunk); reader.onload = function(e) { if (e.target.readyState == 2) { content += new TextDecoder("utf-8").decode(e.target.result); start = temp_end; temp_end = start + BYTES_PER_CHUNK; if (temp_end > end) temp_end = end; return upload(); } } } else { uploading_file = null; console.log(content); // it shows the content of the file console.log('here 3'); return Promise.resolve(content); } } |
您的
尝试将其更改为此:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function upload() { if (start < end) { return new Promise(function (resolve, reject) { var chunk = uploading_file.slice(start, temp_end); var reader = new FileReader(); reader.readAsArrayBuffer(chunk); reader.onload = function(e) { if (e.target.readyState == 2) { content += new TextDecoder("utf-8").decode(e.target.result); start = temp_end; temp_end = start + BYTES_PER_CHUNK; if (temp_end > end) temp_end = end; resolve(upload()); } } }); } else { uploading_file = null; console.log(content); // it shows the content of the file return Promise.resolve(content); } } |
现在,