我正在尝试生成一些代码,我可以在整个网站中重复使用,实际上,这是一个带有一些验证的照片选择器/选择器。这是我的代码:
类PhotoPicker{ 构造函数(…
我认为问题是你期望的那样
reader.onload = () => { photo = this.createPhotoThumb({ url : reader.result, name: file.name, size: file.size }); if (this.validatePhoto(file)) { this.validFiles.items.add(file); }; };
在分配有效文件之前执行get this.output.files 。
this.output.files
但 reader.onload 异步执行,以便将有效文件分配给 this.output.files 在将有效文件添加到有效文件数组之前执行。
reader.onload
你必须实现一些等待完整性的逻辑 onload 读者的处理程序。
onload
这将是一个可能的解决方案:
class PhotoPicker { constructor(element) { this.element = element; // Creating needed HTML Markup this.createMarkUp(); // FileList of valid data. this.validFiles = new DataTransfer(); // Initialise Picker. this.input.onchange = () => { this.updateOutput() .then(() => { this.output.files = this.validFiles.files; }); } } updateOutput() { const files = Array.from(this.input.files); const fileLoaderPromises = []; files.forEach((file) => { const promise = new Promise((resolve) => { let reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => { photo = this.createPhotoThumb({ url : reader.result, name: file.name, size: file.size }); if (this.validatePhoto(file)) { this.validFiles.items.add(file); }; // Mark the file loader as "done" resolve(); }; }) // Add the promise to the list of file loader promises fileLoaderPromises.push(promise); }); // Return a promise which resolves as soon as all file loader promises are done return Promise.all(fileLoaderPromises); } // ... }