gpt4 book ai didi

javascript - filereader.onload 中的函数未在 javascript 中执行

转载 作者:搜寻专家 更新时间:2023-10-30 21:30:26 26 4
gpt4 key购买 nike

我正在使用 filereader 读取文件并使用 base64 执行一些操作。我可以读取文件并获取 base64,但无法使用它来执行某些操作。这是我的代码。

问题是 this.addContentAttachment(this.mimeType,this.base64Url) 行中的代码没有被执行

getBase64(file: any) {
var reader:FileReader = new FileReader();
reader.onload = function (readerEvt: any) {
var binaryString = readerEvt.target.result;
this.base64Url = binaryString;
this.mimeType = this.base64Url.substring(this.base64Url.lastIndexOf("data") + 5, this.base64Url.lastIndexOf(";"));
this.base64Url = this.base64Url.substring(this.base64Url.lastIndexOf("base64") + 7);
this.addContentAttachment(this.mimeType,this.base64Url);
};

reader.readAsDataURL(file);

reader.onerror = function (error) {
console.log('Error: ', error);
};

}

最佳答案

由于更改了上下文 (this),它在 onload 回调中失败。 JavaScript native 更改回调中的上下文。在你的情况下,onload thisreader 相同。您必须绑定(bind)正确的上下文。

解决方案 1您可以通过该函数的绑定(bind)方法将正确的上下文绑定(bind)到传递的函数。

getBase64(file: any) {
var reader: FileReader = new FileReader();
reader.onload = function (readerEvt: any) {
var binaryString = readerEvt.target.result;
this.base64Url = binaryString;
this.mimeType = this.base64Url.substring(this.base64Url.lastIndexOf("data") + 5, this.base64Url.lastIndexOf(";"));
this.base64Url = this.base64Url.substring(this.base64Url.lastIndexOf("base64") + 7);
this.addContentAttachment(this.mimeType, this.base64Url);
}.bind(this); // We forced that when function will be called this will be current this.

reader.readAsDataURL(file);

reader.onerror = function (error) {
console.log('Error: ', error);
};

}

解决方案 2回调的父范围内的 self 变量可以解决同样的问题。我们使用 self 变量来存储正确的上下文,然后我们在回调中使用它而不是标准的(“损坏的”this)。

getBase64(file: any) {
var reader: FileReader = new FileReader();

var self = this; // create self with right this
reader.onload = function (readerEvt: any) {
var binaryString = readerEvt.target.result;
self.base64Url = binaryString; // using self instead this
self.mimeType = self.base64Url.substring(self.base64Url.lastIndexOf("data") + 5, self.base64Url.lastIndexOf(";"));
self.base64Url = self.base64Url.substring(self.base64Url.lastIndexOf("base64") + 7);
self.addContentAttachment(self.mimeType, self.base64Url);
};

reader.readAsDataURL(file);

reader.onerror = function (error) {
console.log('Error: ', error);
};

}

解决方案 3(感谢@Aleksey L.)TypeScript 可以通过自己的语法自动执行解决方案 2。您可以尝试并在 playground 中查看结果,它与解决方案 2 中描述的相同,但变量名为 _this 而不是 self。

getBase64(file: any) {
var reader: FileReader = new FileReader();
reader.onload = (readerEvt: any) => {
var binaryString = readerEvt.target.result;
this.base64Url = binaryString;
this.mimeType = this.base64Url.substring(this.base64Url.lastIndexOf("data") + 5, this.base64Url.lastIndexOf(";"));
this.base64Url = this.base64Url.substring(this.base64Url.lastIndexOf("base64") + 7);
this.addContentAttachment(this.mimeType, this.base64Url);
};

reader.readAsDataURL(file);

reader.onerror = function (error) {
console.log('Error: ', error);
};

}

关于javascript - filereader.onload 中的函数未在 javascript 中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40145266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com