• 异步函数造成的问题: 怎样确保异步执行的FileReader onload成功后才执行后面的语句?


    参考: https://blog.csdn.net/qq_23067521/article/details/73456647

    • 当我们在执行js程序的时候, 本来是想, 前面的代码执行, 给变量赋值, 然后后面的代码使用变量所赋的值. 结果赋值却为空?
    • 或者, 本来是后面的代码, 却先执行了,(用alert语句看到), 前面的代码却后执行了;
    • 或者, 后面的代码执行了, 前面的代码却 "直接跳过了/ 忽略了", 没有执行, 但是调试器控制台也没有错误? 如果有代码有错误, 后面的代码不应该执行阿?
    • 或者, 在后面的代码中, "直接" 有时候使用 前面的赋值 , 却又有了值?
    • 或者, 用FileReader在 console.log的时候, 前面的result/error/onload/onerror/onloadend等等全都是null? 所以代码没有被执行, 当然null是没有代码执行的.
      那为什么后来有时候, filereader.result又有值了呢?

    所有的这一切一切, 都是因为 FileReader是异步执行的, 其onload 是一个异步执行 成功后的 回调函数.
    就是说, onload这个异步操作,即使你写在 前面, 但是它 后面的 的代码,(比如alert('read after.....', someDom.html(reader.result); ) 并不会 "站在那里, 不忙执行, 等到你
    onload执行完毕了, 返回赋值了" 我再执行(如果那样的话, 就叫同步了), 所以, 后面的代码是不管你的, 所以它就呼啦呼啦的执行走了, 完了函数就被销毁了 . 等到你 reader.onload 执行完了, 有返回赋值了给后面的代码使用了, 但是 函数已经被销毁了, 没有机会展示了. 这个就是一切问题的根源!

    • 即一切问题, 都是由 异步执行 引起的

    那 要确实等到 异步函数执行完毕了, 再执行后面的代码怎么办?

    1. 如果是像 ajax这样的可以配置/设置的异步调用, 可以设置其 async: false. 让异步执行变成 同步执行...
    2. 但是像 filereader.onload这样的不能设置成 同步执行的??? 怎么直到异步执行完了, 怎样确保异步执行成功了呢?
    • 但是也不能设置 用 while(1) 这样的 死循环 因为这样会造成 cpu飙升, 造成系统不能动弹, 浏览器卡死,
    • 也不好设置成 setTimer这样的 定时器来检查执行是否完毕?
          var isReadSuc = false;
          while(1){
    	$('div.uc>p').html("正在读取数据, 请等待...");
    	reader.onload = function(){
    	  if(this.readyState == 2){
    	    content = reader.result;
    	    isReadSuc = true;
    	  };
    	};
    
    	  if(isReadSuc)break;
          }
    
          $('div.uc>p').html(reader.result);
          $('div.showuc').css('display','block');
    

    有一个很好的解决方法就是: 将要在 onload等 异步执行后, 异步回调函数赋值成功后,才执行的代码, 放到 异步操作的 回调函数中! 这个要深刻理解异步操作和回调函数的含义

    reader.onload = function(){
    	   content = reader.result;
    	   $('div.uc>p').html(reader.result);
               $('div.showuc').css('display','block');
    	};
          }
    

    linux中的hex 16进制编辑器??

    linux和windows怎样判断文件类型?扩展名不靠谱?

    linux通过文件的头部信息(就是文件开始的几个字节) 来获取文件类型或者编码格式,用到的命令是file命令查看没有扩展名的文件类型?
    linux中的文件扩展名虽然没有太大的意义,但是我们自己在使用的时候, 最好还是加上扩展名, 这样更方便使用起来.
    在实际程序应用中, 那只有告诉用户, 你自己要确保文件确实是文本文件.

  • 相关阅读:
    关于冲动 CQ
    关于在虚拟机上使用boost库 CQ
    新项目奖金分配方案 CQ
    关于桌子 CQ
    linux 添加本地yum源
    linux samba 服务器 简单配置
    linux 修改密码
    linux ntp 服务器和用户端
    linux 修改ip 地址
    Union 和 Union All 的区别
  • 原文地址:https://www.cnblogs.com/bkylee/p/12368068.html
Copyright © 2020-2023  润新知