首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何等待FileReader onload首先完成

如何等待FileReader onload首先完成
EN

Stack Overflow用户
提问于 2022-01-03 09:58:42
回答 2查看 2.2K关注 0票数 1

我正在使用FileReader,并且遇到了一个问题,即FileReader的onLoad方法没有与代码的其余部分同步执行。基本上,我有两个这样的功能:

代码语言:javascript
复制
    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完成它的执行。

EN

回答 2

Stack Overflow用户

发布于 2022-01-03 10:08:33

也许是这样的?

代码语言:javascript
复制
 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);
    });
}

*免责声明:我没有测试它

票数 1
EN

Stack Overflow用户

发布于 2022-01-03 10:40:19

你可以利用承诺。代码仍然可以使用异步/等待进行重构

代码语言:javascript
复制
    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,但如果可以,则解析,否则拒绝。

代码语言:javascript
复制
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})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70564071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档