本文實例講述了ES6 javascript的異步操作。分享給大家供大家參考,具體如下:
異步編程對 JavaScript 語言太重要。 Javascript 語言的執行環境是“ 單線程” 的, 如果沒有異步編程, 根本沒法用, 非卡死不可。
ES6 誕生以前, 異步編程的方法, 大概有下面四種。
① 回調函數
② 事件監聽
③ 發布 / 訂閱
④ Promise 對象
ES6 將 JavaScript 異步編程帶入了一個全新的階段, ES7 的Async函數更是提出了異步編程的終極解決方案。
一、基本概念
1. 異步
所謂 " 異步 ",簡單說就是一個任務分成兩段, 先執行第一段, 然后轉而執行其他任務, 等做好了準備, 再回過頭執行第二段。
比如, 有一個任務是讀取文件進行處理, 任務的第一段是向操作系統發出請求, 要求讀取文件。 然后, 程序執行其他任務, 等到操作系統返回文件,再接著執行任務的第二段( 處理文件)。 這種不連續的執行, 就叫做異步。
相應地, 連續的執行就叫做同步。 由于是連續執行, 不能插入其他任務, 所以操作系統從硬盤讀取文件的這段時間, 程序只能干等著。
2. 回調函數
JavaScript 語言對異步編程的實現, 就是回調函數。 所謂回調函數, 就是把任務的第二段單獨寫在一個函數里面, 等到重新執行這個任務的時候, 就直接調用這個函數。 它的英語名字 callback, 直譯過來就是 " 重新調用 "。
讀取文件進行處理, 是這樣寫的。
fs.readFile('/etc/passwd', function(err, data) { if(err) throw err; console.log(data);});上面代碼中, readFile 函數的第二個參數, 就是回調函數, 也就是任務的第二段。 等到操作系統返回了 / etc / passwd這個文件以后, 回調函數才會執行。
一個有趣的問題是, 為什么 Node.js 約定, 回調函數的第一個參數, 必須是錯誤對象 err( 如果沒有錯誤, 該參數就是 null)? 原因是執行分成兩段, 在這兩段之間拋出的錯誤, 程序無法捕捉, 只能當作參數, 傳入第二段。
3. Promise
回調函數本身并沒有問題, 它的問題出現在多個回調函數嵌套。 假定讀取 A 文件之后, 再讀取 B 文件, 代碼如下。
fs.readFile(fileA, function(err, data) { fs.readFile(fileB, function(err, data) { // ... });});不難想象, 如果依次讀取多個文件, 就會出現多重嵌套。 代碼不是縱向發展, 而是橫向發展, 很快就會亂成一團, 無法管理。 這種情況就稱為 " 回調函數噩夢 " ( callback hell )。
Promise 就是為了解決這個問題而提出的。 它不是新的語法功能, 而是一種新的寫法, 允許將回調函數的嵌套, 改成鏈式調用。 采用 Promise, 連續讀取多個文件, 寫法如下。
新聞熱點
疑難解答
圖片精選