我需要一些FileReader API的帮助。有没有办法从FileReader之外获取数据。我有一个方法的“类”,其中使用FileReader读取图像,我想将图像数据放入类本地变量(如下面的代码所示)。
我知道FileReader是异步工作的,我的解决方案是错误的。有什么方法可以让它发挥作用吗?谢谢。
CanvasState.prototype.addImage = function(inputFile) {
var file = inputFile;
var reader = new FileReader();
reader.onload = this.loadImageData;
reader.readAsDataURL(file);
}
CanvasState.prototype.loadImageData = function(e) {
this.hasImage = true;
this.imageData = e.target.result;
}
答案 0 :(得分:1)
试试这个:
CanvasState.prototype.addImage = function(inputFile) {
var file = inputFile, self = this;
var reader = new FileReader();
reader.onload = function(e) {
self.hasImage = true;
self.imageData = e.target.result;
};
reader.readAsDataURL(file);
}
答案 1 :(得分:0)
这是在函数中设置this
的方式的问题。当你这样做时:
foo.bar();
this
内的 bar()
将为foo
。但如果你这样做:
var bar = foo.bar;
bar();
this
将成为全球对象。
在您的情况下,问题是当您设置reader.onload
时,您将其设置为从CanvasState原型中拉出的函数。当阅读器加载然后调用该函数时,就像上面的例子this
将成为全局对象,而不是addImage
内的对象。
要解决此问题,您可以使用bind()
方法创建新功能,并使用您期望的loadImageData
来调用this
。
基本上,改变:
...
reader.onload = this.loadImageData;
...
到:
...
reader.onload = this.loadImageData.bind(this);
...
查看JavaScript Function bind了解更多信息和互动示例。