淺談 Node.js 的 callback 及 JavaScript object reference 的特性

By | February 28, 2017

Node.js 是用 Chrome V8 JavaScript engine 發展而成。V8 快的原因在於應用了 JIT 以及把 JavaScript 先 compile 成 C++ 再執行。而 Node.js 快的原因除了因使用了 V8 外,就是其著名的 event-driven / callback 機制。Node.js 把 time consuming 的 tasks 例如 disk IO、DB access、network requests 等,包裝成 callback。CPU 不會等回應就繼續執行。

初學者會覺得好困擾,個 program 不知何解有時能正確返回結果,有時就不能。原因在於 callback 及跟 JavaScript object 的 reference 特性有關。

能正確返回結果的原因是 CPU 剛巧被其他 task 阻一阻,以致幸運地等到了 callback,而 object reference 令 callback 能趕及送出 result 前為 object 填入資料,令開發者有錯覺以為 program 能正確運行。而很好多時候,callback 未返回資料時,program 已送出空白結果又或 database 操作未完成時已關閉了 database 連線,以致 program 出錯。

JavaScript 的 object reference 值得提一提。JavaScript 跟 Java 一樣,不能簡單介定是 “call-by-value” 或 “call-by-reference”。JavaScript 傳遞 primitive 時,是直接把值複制,而傳遞 object 時,則把 object 的 reference 複制。這可以埋解為把 object 的 pointer 值複制,而並沒有複制 object 本身。這樣,對 object 內的 property 進行更改後,所有持有 object 的 reference 的 variable 都會被更改。

最後,Node.js 不單運行快,就連開發時間都大大縮短,以下的 RESTFul API 如果改用 JavaEE 寫成,所需的 coding 多不止一倍以上。

Node.js Code Snap

註:以上的 brute_force == 'brute_force'其實可以用 next() 再交到在下面的 function 處理。這裡由於 logic 簡單就直接處理再用 return 結束。