課程目標

  • 把 node 非同步設計改寫為同步設計

課程內容

前面我說過,node 有些地方的寫法設計,看起來很怪、很醜

在瀏覽器 js 環境,我們的確不知道用戶何時會點擊按鈕、不知道 AJAX 回應何時會拿到

不能讓網頁整個停下來卡住、等待上述事件發生,所以必須用「非同步程式設計」處理

可是檔案系統模組,絕大多數情況下,你就是要現在就讀取好檔案、讀取完才讓程式接著繼續跑,才有意義

實在沒必要用「非同步程式設計」處理!

取得用戶輸入就更不用說了,程式就是該停在這裡、等用戶輸入完再接著繼續執行,才有意義

何必用「非同步程式設計」處理!

其他程式語言,大多都是「同步程式設計」,例如用 Python 寫同樣程式時

就是一行一行寫下來即可,不用像這邊這樣把函式當參數傳進去

簡單講,javascript 的非同步設計,在網頁畫面上運作時,有其優勢與必要

但是在用來寫腳本時,顯得多餘而不必要


來學習怎麼改寫吧,打開 read-my-name.js,改寫成以下內容

var fs = require('fs');

var data = fs.readFileSync('my-name.txt');

console.log("您好," + data);

process.exit(0);

執行看看!

node read-my-name.js

跑起來一模一樣,但是不是好讀多了?

注意 fs.readFileSync 後面的 sync,那就是同步的意思


接著來改寫第二個程式吧,打開 write-my-name.js,改寫成以下內容

var fs = require('fs');

const readlineSync = require('readline-sync');

var answer = readlineSync.question('請問您的大名?\n');

fs.writeFileSync('my-name.txt', answer);

console.log('儲存成功。');

process.exit(0);

是不是好讀多了?

新函式名稱,就是後面加上 sync 而已,node 官方知道大家的抱怨,所以有提供這些同步函式

但是,這段 code 不能直接執行,因為 readline-sync 不是官方內建模組,是社群開發的,需要透過 npm 安裝

怎麼辦?


NPM 全稱為 Node Package Manager,也就是 Node 套件管理工具

關於 npm 的安裝,網路上有非常多教學,請根據你的作業系統,自己找一套安裝方法

安裝好之後,你就可以使用「終端機」運行 npm 指令


請在終端機輸入 npm install readline-sync 即可安裝 readline-sync 套件

會多出兩個檔案 package-lock.json package.json 用來記錄目前專案用到的 npm 套件,你可以打開這兩個檔案看一看

還會多出一個資料夾 node_modules,套件本身會下載到這個地方,你可以打開資料夾逛一逛

接著執行看看!

node write-my-name.js

跑起來一模一樣,但是好讀多了!

課後作業

接續前一課的作業,現在來嘗試「同步」的語法

請把「非同步」的語法改寫,通通改用「同步」的語法

改完之後,程式碼中,應該就不會出現 callback function 了

也就是不會出現「把一段函式定義當作參數傳進另一個函式」這種情況

完成以上任務,你就完成這次的課程目標了!


歡迎將作業成果,在下方留言,跟大家分享,讓大家給你一些回饋!

可以將每課學到的觀念、關鍵字,丟到網路上去搜尋、研究一下!

發問請在「討論專區」為主,或者分享學習筆記、寫學習心得!

貼文都會出現在個人檔案頁面,成為學習歷程、部落格紀錄!

未來面試時,分享給面試官看,會讓人知道你的積極程度!


共有 5 則留言

作業繳交 github

按讚的人:

搞不定readlineSync輸不進中文的問題(顯示可以)... github

按讚的人:

之前有人分享 https://codelove.tw/@hung/post/jaljmx 試試看

作業,再麻煩站長了,謝謝!

按讚的人: