異步函數造成的問題: 怎樣確保異步執行的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中的文件擴展名雖然沒有太大的意義,但是我們自己在使用的時候, 最好還是加上擴展名, 這樣更方便使用起來.
在實際程序應用中, 那只有告訴用戶, 你自己要確保文件確實是文本文件.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM