隨著Web2.0的帶來,JavaScript在前端擔任了更多職責,事件也得到了廣泛應用。Node不像Rhino那樣受Java影響很大,而是將前端瀏覽器中應用廣泛的成熟的事件引入后端,配合異步 I/O, 將事件點暴露給業務邏輯。
下面的例子是Ajax異步提交的服務器端處理過程。Node創建一個Web服務器,并偵聽 8080 端口。對于服務器,我們為其綁定了 request 事件,對于請求對象,我們為其綁定了 data 事件和 end 事件:
~~~
const http=require('http');
const querystring = require('querystring');
// 偵聽服務器的request事件
http.createServer((req, res)=>{
var postData='';
req.setEncoding('utf-8');
// 偵聽請求的data事件
req.on('data', (trunk)=>{
postData += trunk;
});
// 偵聽請求的 end 事件
req.on('end',()=>{
res.end(postData);
})
}).listen(8080);
console.log('服務器啟動完成');
~~~
相應地,我們在前段為Ajax請求綁定了 success 事件,在發出請求后,只需關心請求成功時執行相應的業務邏輯即可,相關代碼如下:
~~~
$.ajax({
'url':'/url',
'method':'POST',
'data':{},
'success':function(data){
//success 事件
}
});
~~~
相比之下,無論在前端還是后端,事件都是常用的。對于其它語言來說,這種JavaScript的熟悉感是基本不會出現的。
事件的編程方式具有輕量級、松耦合、只關注事務點等優勢,但是在多個異步任務場景下,事件與事件之間各自獨立,如何協作是一個問題。
從前面可以看到,回調函數無處不在。這是因為在JavaScript中,我們將函數作為一等公民,可以將函數作為對象傳遞給方法作為實參進行調用。
與其它的Web后端編程語言相比,Node除了異步和事件外,回調函數是一大特色。縱觀下來,回調函數也是也是最好的接受異步調用返回數據的方式。但這種編程方式對于很多習慣同步思路編程的人來說,也許是十分不習慣的。代碼的編寫順序與執行順序并無關系,這對他們可能造成閱讀上的障礙。在流程控制方面,因為穿插了異步方法和回調函數,與常規的同步方式相比,變得不那么一目了然了。
在轉變為異步編程思維后,通過對業務的劃分和對事件的提煉,在流程控制方面處理業務的復雜度與同步方式實際上是一致的。
關于流程控制和事件協作的方法和技巧,我們將在第4章中進一步探討。
- 目錄
- 第1章 Node 簡介
- 1.1 Node 的誕生歷程
- 1.2 Node 的命名與起源
- 1.2.1 為什么是 JavaScript
- 1.2.2 為什么叫 Node
- 1.3 Node給JavaScript帶來的意義
- 1.4 Node 的特點
- 1.4.1 異步 I/O
- 1.4.2 事件與回調函數
- 1.4.3 單線程
- 1.4.4 跨平臺
- 1.5 Node 的應用場景
- 1.5.1 I/O 密集型
- 1.5.2 是否不擅長CPU密集型業務
- 1.5.3 與遺留系統和平共處
- 1.5.4 分布式應用
- 1.6 Node 的使用者
- 1.7 參考資源
- 第2章 模塊機制
- 2.1 CommonJS 規范
- 2.1.1 CommonJS 的出發點
- 2.1.2 CommonJS 的模塊規范
- 2.2 Node 的模塊實現
- 2.2.1 優先從緩存加載
- 2.2.2 路徑分析和文件定位
- 2.2.3 模塊編譯
- 2.3 核心模塊
- 2.3.1 JavaScript核心模塊的編譯過程
- 2.3.2 C/C++核心模塊的編譯過程
- 2.3.3 核心模塊的引入流程
- 2.3.4 編寫核心模塊
- 2.4 C/C++擴展模塊
- 2.4.1 前提條件
- 2.4.2 C/C++擴展模塊的編寫
- 2.4.3 C/C++擴展模塊的編譯
- 2.4.2 C/C++擴展模塊的加載
- 2.5 模塊調用棧
- 2.6 包與NPM
- 2.6.1 包結構
- 2.6.2 包描述文件與NPM
- 2.6.3 NPM常用功能
- 2.6.4 局域NPM
- 2.6.5 NPM潛在問題
- 2.7 前后端共用模塊
- 2.7.1 模塊的側重點
- 2.7.2 AMD規范
- 2.7.3 CMD規范
- 2.7.4 兼容多種模塊規范
- 2.8 總結
- 2.9 參考資源
- 第3章 異步I/O
- 3.1 為什么要異步I/O
- 3.1.1 用戶體驗
- 3.1.2 資源分配
- 3.2 異步I/O實現現狀
- 3.2.1 異步I/O與非阻塞I/O
- 3.2.2 理想的非阻塞異步I/O
- 3.2.3 現實的異步I/O
- 3.3 Node的異步I/O
- 3.3.1 事件循環
- 3.3.2 觀察者
- 3.3.3 請求對象
- 3.3.4 執行回調
- 3.3.5 小結
- 3.4 非I/O的異步API
- 3.4.1 定時器
- 3.5 事件驅動與高性能服務器