다음 파일 선택기 대화 상자가 있습니다. 여러 파일 선택을 허용하고 싶습니다. 파일을 선택한 후에는 선택한 파일의 미리보기를 렌더링하고 싶습니다. 내 코드는 다음과 같습니다 그러나자바 스크립트에서 읽은 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' 콜백에서 모든 파일이 읽혔는지 어떻게 알 수 있습니까? 나는 onLoad 콜백에'i' 또는'e.target.files.length'를 넘길 방법이 없습니다. 인덱스와 전체 길이를 전달하는 방법을 찾더라도 모든 파일을 읽을 수 있음을 신뢰할 수 없습니다. 읽은 다섯 번째 파일은 세 번째 파일 읽기 전에 끝날 수도 있습니다. 아니면 다른 방법이 있습니까? –