从reader.onload事件返回变量
Return variable from a reader.onload event
我正在通过JavaScript
读取一个数组,并将该数组的大小保存在reader.onload事件中。我认为reader.onload
函数是在文件上传完成后调用的。CCD_ 3存储该阵列。我希望将该数组保存为变量,以便在其他函数中使用,但是,我尝试初始化一个空数组并使用
slice
函数,但是,它不起作用。控制台返回一个未定义的值。
这是代码
<!DOCTYPE html>
<html>
<head>
<title> Home Page </title>
</head>
<body>
<input type="file" id="file" name="files[]" multiple/>
<output id="list"></output>
<p id="demo"></p>
<script>
function handleFileSelect(evt) {
// grab the file that was uploaded which is type File.
// evt is the event that was triggered
// evt.target returns the element that triggered the event
// evt.target.files[0] returns the file that was uploaded, type File
var file = evt.target.files[0];
var myArray = [];
// instantiate a FileReader object to read/save the file that was uploaded
var reader = new FileReader();
// when the load event is fired (the file has finished uploading) this function is called
reader.onload = function(event) {
// the result attribute contains an ArrayBuffer representing the file's data.
var arrayBuffer = event.target.result;
myArray = arrayBuffer.slice(0);
document.getElementById("demo").innerHTML = arrayBuffer.byteLength;
}
// read the file and save as an array. Once the read is finished loadend is triggered
reader.readAsArrayBuffer(file);
console.log(myArray.byteLength);
}
//console.log(myArray.byteLength);
document.getElementById('file').addEventListener('change', handleFileSelect, false);
</script>
</body>
onload
异步发生。因此,无论什么逻辑依赖于myArray
,都需要在onload
函数中发生。
reader.onload = function(event) {
var arrayBuffer = event.target.result;
var myArray = arrayBuffer.slice(0);
document.getElementById("demo").innerHTML = arrayBuffer.byteLength;
// this needs to happen here
console.log(myArray.byteLength);
}
reader.readAsArrayBuffer(file);
这与经常被问到的问题(关于AJAX/async回调)非常非常相似。如何从异步回调函数返回值?
顺便说一句,这是异步的,因为我们不想在等待读取文件的漫长操作时阻塞整个用户界面。这就是我们在这里使用onload
处理程序的原因。
检查此代码。。我想你会明白你的错误是什么
<body>
<input type="file" id="file" name="files[]" multiple/>
<output id="list"></output>
<p id="demo"></p>
<p id="log"></p>
<script>
function onReadFinish(result){
console.log("Read Finished: " + result.byteLength);
document.getElementById("log").innerHTML = "Read Finished: " + result.byteLength;
}
function handleFileSelect(evt) {
// grab the file that was uploaded which is type File.
// evt is the event that was triggered
// evt.target returns the element that triggered the event
// evt.target.files[0] returns the file that was uploaded, type File
var file = evt.target.files[0];
var myArray = [];
// instantiate a FileReader object to read/save the file that was uploaded
var reader = new FileReader();
// when the load event is fired (the file has finished uploading) this function is called
reader.onload = function(event) {
// the result attribute contains an ArrayBuffer representing the file's data.
var arrayBuffer = event.target.result;
myArray = arrayBuffer.slice(0);
onReadFinish(myArray);
document.getElementById("demo").innerHTML = arrayBuffer.byteLength;
}
// read the file and save as an array. Once the read is finished loadend is triggered
reader.readAsArrayBuffer(file);
}
//console.log(myArray.byteLength);
document.getElementById('file').addEventListener('change', handleFileSelect, false);
</script>
</body>
嘿,不确定这是否会对任何人有所帮助,我在angular 11中尝试了这个。由于onload
是异步发生的。我们需要使用observable来返回在CCD_ 9块中正在处理的最终对象。
calledFunction(event){
const file = event.target.files[0];
reader.readAsArrayBuffer(file);
return New Observable((subscriber: any)=>{
reader.onload = function(event) {
var arrayBuffer = event.target.result;
var myArray = arrayBuffer.slice(0);
document.getElementById("demo").innerHTML = arrayBuffer.byteLength;
subscriber.next(myArray) // myArray object will be returned to the calling function
subscriber.complete(); // Complete the subscriber
}
})
}
现在你可以在任何你想要的地方调用这个函数作为服务或函数调用
calledService.calledFunction(event).subscrib(result=>{
console.log(result)
// To do your logic based on the result object
})
相关文章:
- 如何从jquery函数返回变量
- 返回变量作为构造函数
- 从导出的模块返回变量,并在另一个文件(NodeJS)中使用它
- 在JavaScript和knockout.js中,为什么可以'我不返回一个变量吗?为什么我必须返回变量,就好像它
- 如何从匿名函数返回变量
- 在呈现函数中返回变量
- 在设置超时后返回变量
- AngularJS在大括号中返回变量名称,而不是值
- JQuery:创建扩展返回变量未定义
- 我应该从量角器中元素的 getText() 承诺中分配一个变量或返回变量
- AJAX 在 cicle 完成后返回变量
- 如何返回变量并同时重置/删除它
- 如何从 javascript 中的回调函数返回变量
- 返回变量而不声明它的函数
- 正在从数组中返回变量名
- 从reader.onload事件返回变量
- 延迟返回变量,直到数据从Firebase同步
- 函数不't返回变量
- 如何将函数中的返回变量插入HTML表单
- Javascript 方法不返回变量