angular - Angular 8:无法访问在 FileReader onloadend 方法中设置的类变量
问题描述
我无法访问在 FileReader onloadend 方法中设置的类变量。
这是我的代码:
analyzeData(){
let file = this.fileRestful[0];
let fileReader: FileReader = new FileReader();
fileReader.onloadend = () => {
this.fileContent= fileReader.result as string;
}
fileReader.readAsText(file);
console.log(this.fileContent)
}
到目前为止,我已经尝试了 3 种方法,但都没有奏效。以下是他们:
fileReader.onloadend = () => { this.fileContent= fileReader.result as string; }
fileReader.onloadend = function(e) = { this.fileContent= fileReader.result as string; }.bind(this)
let self = this; fileReader.onloadend = function(e) = { self.fileContent= fileReader.result as string; }
我已经看到了大部分解决方案,但没有一个对我有用。请让我知道我在哪里出错。谢谢你。
解决方案
我不认为这里的问题是由this
关键字引起的。你this
点到了正确的地方,但没有分配给this.fileContent
变量。
this.fileContent
设置在异步代码块中。你的赋值会在你之后执行console.log
,因为fileReader.onloadend
它只是一个监听器,类似于onclick
DOM 中的监听器。
fileReader.onloadend = () => {
this.fileContent= fileReader.result as string; // this code will be executed some time in the future
}
fileReader.readAsText(file);
console.log(this.fileContent); // this code will be executed first
换句话说,在第一行中,您向事件添加了一个事件侦听器loadend
。您的箭头函数将在loadend
发生时执行,而不是立即执行。什么时候会发生 - 我们不知道,可能在三年内,可能在 0.0002 秒内,但肯定是在您的其余代码执行之后。
解决方案
console.log
当您将其移至代码的异步部分时,您将反映现实,如下所示:
fileReader.onloadend = () => {
this.fileContent= fileReader.result as string; // this code will be executed some time in the future
console.log(this.fileContent); // and after that you do your console.log
}
fileReader.readAsText(file);
setTimeout
,on*
处理程序,内部代码addEventListener
是我们需要始终记住代码执行时间的示例。它可以在同步代码后三秒或三年执行。我建议阅读的规范资源是 MDN 上的本节。很多,但为了编写js代码,理解它是必不可少的。
推荐阅读
- python - 当模板中存在另一个表单时,如何知道提交按钮是否使用 get 方法单击了表单?
- javascript - 使用 CSS / JavaScript 将样式设置为稍后可见的元素
- python - 如何在 Python 中对许多字典应用一些操作(或:如何在 for 循环中修改字典)
- excel - Excel:遍历嵌套文件夹并复制粘贴文件:需要对象错误
- react-native - 登录成功后如何加载主屏幕而不显示登录屏幕?
- java - 从有序列表开始创建列表列表
- javascript - 使用文本更新 DOM 节点会覆盖旧文本
- asynchronous - TCL中的fileevent非常慢
- android - 模拟 SharedPreferences.Editor.putString()
- tfs - 为什么 tfs 2018 部署组阶段将在前一个部分失败后运行?