前幾篇文章主要講了可讀流、可寫流以及pipe方法,這篇文章主要介紹一下Duplex流和Transform流!
Duplex流這個流比較簡單,它主要繼承了可讀流Readable和可寫流Writable,并且沒有定義其他的API,如圖1所示:
圖1
也就是說它既可以當做可讀流使用也可以當做可寫流使用!
圖2
如圖2所示,readable讀入了5、4、3、2、1,writable1作為可寫流将它們依次消費,同時writable1也作為可讀流依次将10、9、8、7、6讀入,由writable2作為可寫流消費,這裡writable1和writable2都是Duplex流,所以Duplex流是可以代替readable和writable使用的!
Transform流這個流主要繼承自Duplex流,所以它也可以同時當做可讀流和可寫流,通過參數自定義_transform方法和_flush方法,并且transform流自身實現了一個_write方法和_read方法,如圖3所示:
圖3
先看一個簡單的demo如下:
圖4
圖4中的transform流被當做了可寫流,并且在自定義的transform方法中可以消費上遊傳下來的數據,我們回想一下之前可讀流writable是在_write方法中消費數據的,那麼此處transform方法和_write方法是有什麼關聯嗎?
圖5
通過源碼,我們可以發現_write方法内部調用了transform方法,這樣就通了,如圖5所示!
Transform流核心能力是把處理之後的數據自動存入到自己的可讀流緩存區,此時就是自動将自己從可寫流轉别為可讀流,此處的玄機就在next方法!
圖6
如圖6,我們把之前的next方法再封裝一層,除了執行之前的next方法外,還把消費後的數據通過push方法存入自己的可讀流緩存區,此處Transform流即是一個可讀流也是一個可寫流!
圖7
如圖7中,我們再pipe一個可寫流,你會發現,第一次讀入的是0、1、2、4.....,在transform中處理一次(加一個‘1’字符串),此時最後的可寫流會消費上遊transform流傳下去的數據。
另外,當transform流作為可寫流時,消費完其可寫流緩存區的數據時會觸發一個prefinish事件,來通知用戶是否還需要額外向自己push數據(此處是把自己當做可讀流),如下圖所示:
圖8
從圖8中就可以看出來_flush方法的作用,可以額外追加數據,如下圖,最後額外追加了數據‘end’。
圖9
總結這篇文章主要分析了Transform流的特點,它和Duplex流一樣,既能當做可讀流也能當做可寫流,不同的是前者可以自動将自己從可寫流轉化為可讀流,而後者不具備這樣的能力(當然可以自己在_write方法中開發這樣的邏輯)!前面還提到一個流PassThrough,其實它就是Transform流,隻是換了個名字而已!下一篇我們讨論一下如何寫gulp插件,它就是對Transform流的實際應用!
喜歡我的文章就關注我吧,有問題可以發表評論,我們一起學習,共同成長!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!