我正在使用FileReader,并且遇到了一个问题,即FileReader的onLoad方法没有与代码的其余部分同步执行。基本上,我有两个这样的功能:
imageExists(url, callback) {
var img = new Image();
img.onload = function () { callback(true); };
img.onerror = function () { callback(false); };
img.src = url;
}
isImageCorrupt(file): boolean {
var reader = new FileReader();
var isCorrupt = false;
reader.readAsDataURL(file);
reader.onload = (e) => {
this.imageExists(e.target.result, (exists) => {
if (exists) {
isCorrupt = false;
// Image is not corrupt
} else {
isCorrupt = true;
//Image is corrupt
}
});
};
return isCorrupt;
}
isImageCorrupt()函数调用调用imageExists回调函数的reader.onLoad,该回调函数还包含一个图像onload方法。
问题是,在执行isImageCorrupt()函数时,reader.onLoad尚未更改isCorrupt的值,但函数在最后一行中返回的值始终为false。
我希望函数在返回值之前等待reader.onLoad完成它的执行。
发布于 2022-01-03 10:08:33
也许是这样的?
isImageCorrupt(file): Promise<Boolean> {
return new Promise((resolve) => {
var reader = new FileReader();
reader.onload = (e) => {
var img = new Image();
img.onload = function () {
resolve(false);
};
img.onerror = function () {
resolve(true);
};
img.src = <string>e.target.result;
}
reader.readAsDataURL(file);
});
}
*免责声明:我没有测试它
发布于 2022-01-03 10:40:19
你可以利用承诺。代码仍然可以使用异步/等待进行重构
isImageCorrupt(file): Promise<boolean> {
return new Promise<boolean>((resolve,reject)=>{
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = ()=>{
var img = new Image();
img.src = reader.result;
img.onload = function () {
resolve(false);
};
img.onerror = function () {
resolve(true);
};
}
reader.onerror=()=>{reject(true)}
});
};
isImageCorrupt(yourFile).then((result)=>{/*HERE USE RESULT*/},(error)=>{HERE USE ERROR RESULT})
但是,如果没有布尔值,则不应该返回true o false,但如果可以,则解析,否则拒绝。
isImageCorrupt(file): Promise<void> {
return new Promise<void>((resolve,reject)=>{
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = ()=>{
var img = new Image();
img.src = reader.result;
img.onload = function () {
resolve();
};
img.onerror = function () {
reject();
};
}
reader.onerror=()=>{reject()}
});
};
isImageCorrupt(yourFile).then(()=>{/*HERE OK*/},()=> {HERE
THERE WAS SOME ERROR/PROBLEM})
https://stackoverflow.com/questions/70564071
复制相似问题