次のファイルセレクタダイアログがあります。私は複数のファイルの選択を許可したい。ファイルが選択されたら、選択したファイルのプレビューをレンダリングします。私のコードは次のとおりです。ただし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})
を呼び出す方法はありますか?
すべてのコードは重要な場合は反応ファイルにあります。
メインスレッドをブロックしないように非同期です。これは、ファイルサイズに応じて応答しないページにつながる可能性があります。したがって、そのページでは許可されていません。しかし、(ワイルドカードリーダー)[https://developer.mozilla.org/en-US/docs/Web/API/FileReaderSync]は、 'ワーカー 'でアクセス可能です。 – Panther
すべてのファイルが読み込まれている場合、 'onLoad'コールバックと' set previews'にチェックを追加できます。 – Panther
'onLoad'コールバックで、すべてのファイルが読み込まれたかどうかを知る方法を教えてください。私は 'on'または' e.target.files.length'を 'onLoad'コールバックに渡す方法がありません。インデックスと全長を渡す方法が見つかったとしても、すべてのファイルが読み込まれていることを確実に知ることはできません。 5番目のファイルの読み込みは、3番目のファイルの読み込みなどの前に終了することがあります。 –