异步函数造成的问题: 怎样确保异步执行的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中的文件扩展名虽然没有太大的意义,但是我们自己在使用的时候, 最好还是加上扩展名, 这样更方便使用起来.
在实际程序应用中, 那只有告诉用户, 你自己要确保文件确实是文本文件.

posted @ 2020-02-26 17:38  noitanym  阅读(7025)  评论(0编辑  收藏  举报