我正在尝试使用 FileReader 上传一组文件,这些文件经过 base64 编码并存储在一个数组中以供进一步处理。我正在努力理解我需要创建的模式以确保所有文件都已上传,因为我必须等待 onload 事件处理程序触发。例如;
如果我将一组文件传递给以下函数,它将在文件实际上传之前解决 promise 。
localUploads( event ) : any {
var response = [];
return new Promise( function(resolve, reject) {
//Retrieve all the files from the FileList object
var files = event.target.files;
var response = [];
if (files) {
for (var i=0, f; f=files[i]; i++) {
var r = new FileReader();
r.onload = (function(f) {
return function(e) {
let contents = e.target['result'];
let file = {
name: f.name,
asset: contents,
private: false
};
console.log('we are pushing into the array');
response.push( file );
};
})(f);
}
resolve( response );
}
r.readAsText(f);
});
}
任何人都可以请教新手吗?
非常感谢。
最佳答案
一切都是为了在正确的时间兑现 promise 。目前您在循环完成时解决它,但这并不意味着所有项目都已处理。我没有使用过 FileReader,但你应该可以这样做:
localUploads( event ) : any {
var response = [];
return new Promise(function(resolve, reject) {
//Retrieve all the files from the FileList object
var files = event.target.files;
var response = [];
if (files) {
for (var i=0, f; f=files[i]; i++) {
var r = new FileReader();
r.onload = function(e) { // Possible clean-up?
let contents = e.target['result'];
let file = {
name: f.name,
asset: contents,
private: false
};
console.log('we are pushing into the array');
response.push( file );
if(response.length == files.length)
{
// Everything is done. Resolve the promise.
resolve( response );
}
};
// Moved here to be able to access r and f variables
r.readAsText(f);
}
}
});
}
或者使用 $q
的旧方法。
var response = [];
var dfd = $q.defer();
//Retrieve all the files from the FileList object
var files = event.target.files;
var response = [];
if (files) {
for (var i=0, f; f=files[i]; i++) {
var r = new FileReader();
r.onload = function(e) { // Possible clean-up?
let contents = e.target['result'];
let file = {
name: f.name,
asset: contents,
private: false
};
console.log('we are pushing into the array');
response.push( file );
if(response.length == files.length)
{
// Everything is done. Resolve the promise.
dfd.resolve(response);
}
};
// Moved here to be able to access r and f variables
r.readAsText(f);
}
}
else {
// Possible resolve promise here to?
}
return dfd.promise;
请注意,您可能还想处理可能出现的错误。如果其中一个文件没有成功完成, promise 将永远不会得到解决。
您可能需要解决 onloadend
中的 promise 而不是 onload
。我真的无法从 docs 中找出答案.
var r = new FileReader();
r.onload = function(e) {
if(response.length == files.length)
{
// Everything is done. Resolve the promise.
dfd.resolve(response);
}
}
关于javascript - Angular 2 : Asynchronous upload array of files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39955367/