NodeJs中談及較多的可能就是Stream模塊了,先寫一個簡單的ajax回調javascript
$.post("index.php",{data:'aaa',order:'ccc'},function(data){ $("#a").html(data); })
經過post php文件獲得回調數據,並進行DOM操做,這行簡單的代碼在初學者百分之八十的項目中是可行的,包括在我接觸Stream以前也是這樣認爲的,那麼問題來了,假如咱們這邊的data是由php多處輸出拼接而成的,數據量極大,而此時客戶端又有很大的延時,那麼做爲一個訪問者而言,其用戶體驗是不好的,他須要等到你的data所有接受完畢以後,纔會進行DOM操做。而Stream的應用場景這是這樣一個大數據傳輸的過程。php
首先談及Stream最基本的概念,中文翻譯爲流,百度看到網上衆多介紹流的博客,有一篇讓我印象深入,將服務器比喻成一個水桶,客戶端比喻成一個空桶,而中間有一個水管,從服務器向客戶端送水的過程其實就是一個流的過程。既然大數據須要等處理完畢才能進行DOM操做,那爲何咱們不把data接受一部分就處理一部分呢html
Stream在使用時咱們會發現很像原生的Ajax,也有點像監聽事件start,move,end,官網對Stream的定義是:java
全部的 Stream 對象都是 EventEmitter 的實例。經常使用的事件有:ajax
data - 當有數據可讀時觸發。服務器
end - 沒有更多的數據可讀時觸發。post
error - 在接收和寫入過程當中發生錯誤時觸發。大數據
finish - 全部數據已被寫入到底層系統時觸發。spa
代碼表示下實際流操做的過程:翻譯
var rs = fs.createReadStream(path); rs.on('data', function (chunk) { DOM操做 }); rs.on('end', function () { xxxx }) ;
實際中可能遇到最大的問題就是數據的發送速度遠大於回調讀取操做,這是咱們就須要加上必定的打斷
var rs = fs.createReadStream(path) ; rs.on('data', function (chunk) { rs.pause() ; DOM(chunk, function () { rs.resume() ; }) ; }) ; rs.on('end', function () { cleanUp(); }) ;
而流在實際應用中最多的應用場景可能就是文件複製,而Node官網提供了另一種方法pipe()
// pipe自動調用了data,end等事件 fs.createReadStream('/path/to/source').pipe(fs.createWriteStream('/path/to/dest'));