成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript 中回調、Promise 和 Async/Await 的代碼案例

開發 前端
如果你對 JavaScript 中的異步有一定的了解,但需要一個直觀的代碼案例作為參考,那么本文就是給你準備的。

本文將通過代碼示例展示如何使用基于回調的 API,然后將其改成使用 Promises,最后再用 Async/Await 語法。本文不會詳細解釋回調、promise 和 Async/Await 語法。有關這些概念的詳細解釋,請查看 MDN 的 Asynchronous JavaScript[1],它解釋了什么是異步性以及如何用回調、promise 和 Async/Await 語法處理異步 JavaScript。

如果你對 JavaScript 中的異步有一定的了解,但需要一個直觀的代碼案例作為參考,那么本文就是給你準備的。

出于演示目的,我們將使用 fs.readFile[2],這是一個基于回調的用于讀取文件的 API。我們將會先創建一個包含一些文本的文件 test.txt,然后用 script.js 來打開文件、讀取內容并將其輸出到終端。

代碼將首先用回調實現,然后將其修改為使用 Promise,最后改為使用 Async/Await,而不是直接使用 Promise。

廢話少說,開始!

使用回調

首先創建一個目錄,里面包含我們的代碼文件和要進行讀取操作的文件。

先創建著兩個文件;

  1. $ mkdir ~/code 
  2. $ touch ~/code/script.js 
  3. $ echo "Beam me up, Scotty" > ~/code/test.txt 
  4. $ cd ~/code/ 

在 script.js 文件中,輸入以下代碼:

  1. const fs = require("fs") 
  2.  
  3. function readFileCallBack() { 
  4.  
  5. fs.readFile("./test.txt", 'utf8',  (err, data) => { 
  6.   if (err) { 
  7.     console.error(err) 
  8.     return 
  9.   } 
  10.    
  11.   console.log(data.trim() + " [callback]") 
  12.  }) 
  13.  
  14.  
  15. readFileCallBack() 

通過 node script.js 命令執行腳本,會在終端上輸出“Beam me up, Scotty”:

  1. $ node script.js 
  2. Beam me up, Scotty [callback] 

對于回調的寫法,異步操作的結果會被傳給執行異步操作的函數,并由其進行處理。

使用 Promise

修改 script.js 并添加一個使用 promise 的 readFileCallback 版本。代碼如下:

  1. function readFilePromise() { 
  2.   return new Promise((resolve, reject) => { 
  3.      fs.readFile("./test.txt", 'utf8',  (err, data) => { 
  4.      if (err) { 
  5.        reject(err) 
  6.        return 
  7.      } 
  8.  
  9.       resolve(data.trim()) 
  10.     }) 
  11.   }); 
  12.  
  13.  
  14. readFilePromise() 
  15.  .then(data => console.log(data  + " [promise]")) 
  16.  .catch(err => console.log(err)) 

通過 node script.js 命令來執行腳本:

  1. $ node script.js 
  2. Beam me up, Scotty [callback] 
  3. Beam me up, Scotty [promise] 

使用promise,異步操作的結果由傳遞給 promise 對象公開的 then 函數進行處理。

使用 Async/Await

修改 script.js 并添加使用 Async/Await 語法的第三個版本。由于 Async/Await 是一種能讓 promise 更容易的語法,所以 Async/Await 實現將使用 readFilePromise() 函數。代碼是這樣的:

  1. async function readFileAsync() { 
  2.   try { 
  3.     const data = await readFilePromise() 
  4.     console.log(data.trim() + " [async-await]") 
  5.   } catch (err) { 
  6.     console.log(err) 
  7.   } 
  8.  
  9. readFileAsync() 

Executing the script by running node script.js will print something similar to this, to the terminal: 通過運行節點腳本執行腳本.js將打印與此類似的東西,到終端:

  1. Beam me up, Scotty [callback] 
  2. Beam me up, Scotty [promise] 
  3. Beam me up, Scotty [async-await] 

使用 async/await,異步操作的結果被當作同步操作來處理。await 對此負責,而使用它的函數必須以 async 關鍵字開頭。

3種實現的完整代碼如下:

  1. const fs = require("fs") 
  2.  
  3. // callback 
  4. function readFileCallBack() { 
  5.  
  6. fs.readFile("./test.txt", 'utf8',  (err, data) => { 
  7.   if (err) { 
  8.     console.error(err) 
  9.     return 
  10.   } 
  11.   console.log(data.trim() + " [callback]") 
  12.    
  13.  }) 
  14.  
  15.  
  16. readFileCallBack() 
  17.  
  18. // promise 
  19. function readFilePromise() { 
  20.   return new Promise((resolve, reject) => { 
  21.      fs.readFile("./test.txt", 'utf8',  (err, data) => { 
  22.      if (err) { 
  23.        reject(err) 
  24.        return 
  25.      } 
  26.  
  27.       resolve(data.trim()) 
  28.     }) 
  29.   }); 
  30.  
  31.  
  32. readFilePromise() 
  33.  .then(data => console.log(data  + " [promise]")) 
  34.  .catch(err => console.log(err)) 
  35.  
  36.  
  37. // async/await 
  38. async function readFileAsync() { 
  39.   try { 
  40.     const data = await readFilePromise() 
  41.     console.log(data.trim() + " [async-await]") 
  42.   } catch (err) { 
  43.     console.log(err) 
  44.   } 
  45.  
  46. readFileAsync() 

錯誤處理

為了驗證在 3 種代碼實現在工作時錯誤處理是否會按預期工作,重命名 test.txt 文件并重新運行腳本:

  1. $ mv test.txt test.txt.backup 
  2. $ node script.js 
  3. [Error: ENOENT: no such file or directory, open './test.txt'] { 
  4.   errno: -2, 
  5.   code: 'ENOENT', 
  6.   syscall: 'open', 
  7.   path: './test.txt' 
  8. [Error: ENOENT: no such file or directory, open './test.txt'] { 
  9.   errno: -2, 
  10.   code: 'ENOENT', 
  11.   syscall: 'open', 
  12.   path: './test.txt' 
  13. [Error: ENOENT: no such file or directory, open './test.txt'] { 
  14.   errno: -2, 
  15.   code: 'ENOENT', 
  16.   syscall: 'open', 
  17.   path: './test.txt' 

3種實現都會顯示錯誤處理代碼(僅將錯誤輸出到控制臺),說明它們都按預期執行了。

 

責任編輯:趙寧寧 來源: 前端先鋒
相關推薦

2023-10-08 10:21:11

JavaScriptAsync

2024-09-02 14:12:56

2021-07-20 10:26:12

JavaScriptasyncawait

2021-05-18 07:52:31

PromiseAsyncAwait

2017-06-19 09:12:08

JavaScriptPromiseAsync

2016-11-22 11:08:34

asyncjavascript

2017-04-10 15:57:10

AsyncAwaitPromise

2022-11-21 09:01:00

Swift并發結構

2018-11-29 08:00:20

JavaScript異步Promise

2023-03-29 10:19:44

異步編程AsyncPromise

2017-11-16 16:15:28

Await開發嵌套

2014-07-15 10:31:07

asyncawait

2023-11-10 16:31:31

2023-09-15 15:31:23

異步編程Promise

2021-01-14 07:52:24

JavaScript回調函數

2015-07-23 11:59:27

JavascriptPromise

2021-06-28 08:10:59

JavaScript異步編程

2024-06-25 08:33:48

2014-07-15 10:08:42

異步編程In .NET

2022-06-24 08:33:13

ECMAScriptjavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕一区在线观看视频 | 在线色网站 | 国产成人一区 | 男人的天堂avav | 麻豆久久久9性大片 | 四虎影视免费观看 | 欧美电影免费观看高清 | 91久久国产综合久久91精品网站 | 中文字幕一区二区三区四区 | 91精品国产一区二区三区动漫 | 日韩一区二区三区在线看 | 91色视频在线观看 | 一级黄色片在线免费观看 | 国产精品福利在线观看 | 亚洲精品白浆高清久久久久久 | 嫩草视频网站 | 狠狠影院 | 精品国产一区二区 | 国产精品视频久久 | 午夜小影院 | 久久久久一区二区三区 | 亚洲最大av网站 | www.亚洲视频 | 手机看黄av免费网址 | 亚洲人成人一区二区在线观看 | 免费黄色片在线观看 | 中文字幕免费中文 | 国产日韩欧美中文字幕 | 日本精品视频 | 日本色综合 | 国产精品99久久久久久久久 | 视频1区| 天天色官网| 天天碰夜夜操 | 国产精品视频在线免费观看 | 久久久久国产一区二区三区四区 | 午夜精品久久久久久久久久久久久 | 欧美一区二 | 精品9999| 国产成人免费网站 | 韩日在线观看视频 |