我有以下文件選擇器對話框。我想允許選擇多個文件。選擇文件後,我想渲染選定文件的預覽。我的代碼是:用Javascript讀取Synchronos文件
<input
type="file"
multiple
accept=".png, .jpeg"
onChange={e => {
this.setState({ previews: [] });
if (!e.target.files) {
return;
}
var previews = [];
for (var i = 0; i < e.target.files.length; i++) {
var file = e.target.files[i];
(function(file, previews) {
var reader = new FileReader();
reader.onload = function(e) {
// console.log(e.target.result);
console.log("Just pushed a new preview");
previews.push(e.target.result);
};
reader.readAsDataURL(file);
})(file, previews);
}
console.log("All files read");
// I want this to be called only after
// all the file contents are read
this.setState({ previews });
}}
/>
然而,與上面的代碼,All files read
印在控制檯上後,我的Just pushed a new preview
打印。
有沒有辦法讓FileReader循環(閉合)完成,然後調用this.setState({previews})
?
所有這些代碼都在反應文件中,如果它很重要。
它是異步的,不阻止主線程。這可能會導致頁面無法響應,具體取決於文件大小。所以它不允許在頁面中。但是(FileReaderSync)[https://developer.mozilla.org/en-US/docs/Web/API/FileReaderSync]存在,可以在'workers'中訪問。 – Panther
如果已經讀取了所有文件,您可以在'onLoad'回調和'set previews'中添加一個支票。 – Panther
如何在'onLoad'回調中瞭解是否讀取了所有文件。我沒有辦法將'i'或'e.target.files.length'傳遞給'onLoad'回調函數。即使我找到了通過索引和總長的方法,我也無法可靠地知道所有文件都被讀取了。讀取的第5個文件可能會在讀取第3個文件之前完成,或者還有其他方法嗎? –