Javascript 从FileReader()返回字节数组

Javascript 从FileReader()返回字节数组,javascript,filereader,Javascript,Filereader,我需要一些帮助,从下面这个函数返回“bytes”变量,作为另一个函数的输入 function openfile() { var input = document.getElementById("files").files; var fileData = new Blob([input[0]]); var reader = new FileReader(); reader.readAsArrayBuffer(fileData); reader.onload = function(){ v

我需要一些帮助,从下面这个函数返回“bytes”变量,作为另一个函数的输入

function openfile() {
var input = document.getElementById("files").files;
var fileData = new Blob([input[0]]);

var reader = new FileReader();
reader.readAsArrayBuffer(fileData);
reader.onload = function(){
    var arrayBuffer = reader.result
    var bytes = new Uint8Array(arrayBuffer);
    console.log(bytes);
}

我希望获得上述函数的返回值,并在另一个函数中使用字节数组作为输入参数。

您可以使用承诺等待文件读取器完成文件加载

function openfile() {
var input = document.getElementById("files").files;
var fileData = new Blob([input[0]]);

var reader = new FileReader();
reader.readAsArrayBuffer(fileData);
reader.onload = function(){
    var arrayBuffer = reader.result
    var bytes = new Uint8Array(arrayBuffer);
    console.log(bytes);
}
Promise对象用于延迟和异步计算。承诺表示尚未完成的操作,但预计将在将来完成

你可以找到更多关于承诺的信息

下面是一个例子,说明如何将承诺融入到您的情况中

(功能(文档){
var input=document.getElementById(“文件”),
output=document.getElementById('output');
//用于文件输入的Eventhandler。
函数openfile(evt){
var files=input.files;
//将文件传递给blob,而不是输入[0]。
fileData=newblob([files[0]]);
//将getBuffer传递给promise。
var promise=newpromise(getBuffer(fileData));
//等待承诺得到解决,或记录错误。
promise.then(函数(数据){
//在这里,您可以将字节传递给另一个函数。
output.innerHTML=data.toString();
控制台日志(数据);
}).catch(函数(err){
log('Error:',err);
});
}
/* 
创建一个将传递给promise的函数
并在FileReader加载完文件后解决此问题。
*/
函数getBuffer(文件数据){
返回函数(解析){
var reader=new FileReader();
reader.readAsArrayBuffer(文件数据);
reader.onload=函数(){
var arrayBuffer=reader.result
var字节=新的Uint8Array(arrayBuffer);
解析(字节);
}
}
}
//用于文件输入的Eventlistener。
input.addEventListener('change',openfile,false);
}(文件)

如果将
onload
函数传递给事件,则可以使其工作

reader.onload = function(e){
    var arrayBuffer = e.target.result;
    var bytes = new Uint8Array(arrayBuffer);
    console.log(bytes);
}
这将其从
reader.result
更正为
e.target.result


此外,在使用
fileData
时存在问题,该数据被设置为
Blob[files[0]]
并将其发送到
阅读器。readAsArrayBuffer
。删除
fileData
并使用
reader.readAsArrayBuffer(输入[0])调用它

返回字节怎么样?要将其用作另一个函数的参数,请如下使用:
myfunction(openfile(evt))如果从“console.log(bytes);”更改为“return bytes;”并在“console.log(openfile());”外部调用,则会得到“undefined”,这与我所寻找的不完全一样。但我想我会改变我计划的方式。谢谢。请注意,IE直到版本11才支持Promise对象。看起来不错,但对我来说不起作用。行变量字节=新的Uint8Array(arrayBuffer);出现错误TS2345:“string | ArrayBuffer”类型的参数不能分配给“ArrayBuffer | SharedArrayBuffer | ArrayLike”类型的参数。@mli您好,请问您使用的是TypeScript吗?如果是这样,你确定你正确地铸造了你的类型吗?@DavidDomain。是的,是打字稿。所以我不得不这样说:const bytes=newuint8array(reader.result为ArrayBuffer);无论如何,谢谢你,我只是个新手,所以我认为javascript和typescript没有区别。e.target没有结果属性。@KingWilder如果你使用IE,你可能需要
e.srcElement
。如果你用的是Chrome,它就在那里。但是也有一些可能使它无法工作的东西,OP基本上使用的是
reader.readAsArrayBuffer(新Blob([input[0]])当它应该是
reader.readAsArrayBuffer(document.getElementById(“文件”).files[0]),它最初没有在这里得到地址,并且将改变
e
的内容。我在编辑中添加了它。