參考: 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 執行完了, 有返回賦值了給后面的代碼使用了, 但是 函數已經被銷毀了, 沒有機會展示了. 這個就是一切問題的根源!
- 即一切問題, 都是由 異步執行 引起的
那 要確實等到 異步函數執行完畢了, 再執行后面的代碼怎么辦?
- 如果是像 ajax這樣的可以配置/設置的異步調用, 可以設置其 async: false. 讓異步執行變成 同步執行...
- 但是像 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中的文件擴展名雖然沒有太大的意義,但是我們自己在使用的時候, 最好還是加上擴展名, 這樣更方便使用起來.
在實際程序應用中, 那只有告訴用戶, 你自己要確保文件確實是文本文件.
