国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

理解nodejs的stream和pipe機制的原理和實現(xiàn)

2024-05-06 16:38:58
字體:
來源:轉載
供稿:網(wǎng)友

前言

前幾天別人請教我關于pipe的問題,我發(fā)現(xiàn)我雖然用了nodejs很久,但是由于每次用的不多所以經(jīng)常回避stream的使用,導致一直不熟,現(xiàn)在重新學習整理一下相關知識。

通過nodeschool學習stream

nodeschool有一個stream-adventure教程教導stream的使用,很簡單

簡單stream進行pipe

首先,我們可以通過管道將輸入定位到輸出,輸入輸出可以是控制臺或者文件流或者http請求,比如

process.stdin.pipe(process.stdout)process.stdin.pipe(fs.createWriteStream(path))fs.createReadStream(path).pipe(process.stdin)

pipe中間進行處理

如果我們想要在管道中間進行處理,比如想將輸入的字符串變成大寫寫到輸出里,我們可以使用一些可以作為中間處理的框架,比如through2就很方便

var through2 = require('through2');var stream = through2(write,end)process.stdin  .pipe(stream)  .pipe(process.stdout);function write(line,_,next){  this.push(line.toString().toUpperCase())  next();})function end(done){  done();})

stream轉化成普通回調

當我們輸入是流,而輸出是個普通函數(shù),我們需要把輸入流轉化為普通的buffer,這時可以試用concat-stream庫

var concat = require('concat-stream');var reverseStream=concat(function(text){  console.log(text.toString().split("").reverse().join(""));})process.stdin.pipe(reverseStream)

http server中的流

類似stdin和fs,http由于其特性也適合使用流,所以其自帶類似特性

var http = require('http');var server = http.createServer(function(req,res){  req.pipe(res);})

既作為輸入也作為輸出的流

request框架實現(xiàn)了如下功能,將一個流pipe到request請求中,然后將流的內(nèi)容發(fā)給服務器,然后返回作為流供其他代碼使用,實現(xiàn)如下

var request = require('request');var r = request.post('http://localhost:8099');process.stdin.pipe(r).pipe(process.stdout)

分支管道

下邊是一個例子,這個例子將輸入管道中html包含loud class的元素放入另一個管道進行大寫操作,然后最后合并成輸出

var trumpet = require('trumpet');var through2 = require('through2');var fs = require('fs');var tr = trumpet();var stream = tr.select('.loud').createStream();var upper = through2(function(buf,_,next){  this.push(buf.toString().toUpperCase());  next();})stream.pipe(upper).pipe(stream);process.stdin.pipe(tr).pipe(process.stdout);

合并輸入輸出stream例子

合并后的輸入輸出可像前文request一樣使用,下邊這個例子實現(xiàn)了使用流的方式進行子進程調用

var spawn = require('child_process').spawn;var duplexer2 = require('duplexer2');module.exports = function(cmd, args){  var c = spawn(cmd,args)  return duplexer2(c.stdin,c.stdout)}

總結

通過上邊的例子,可以知道stream應該還有如何合并等更復雜的應用方式。總之整體上符合如下特性:

  • Stream分為readable、writeble
  • Stream通過pipe方法控制流向
  • httpServer和httpClient和file system和process.stdin/out/err通常可以作為stream
  • Stream可以被on(event)轉化為普通的變量,普通變量可以被write轉換成stream
  • Stream自身可以被拆分、合并、過濾

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 德保县| 青神县| 平凉市| 隆化县| 长治县| 嘉黎县| 宣化县| 亳州市| 北海市| 香河县| 积石山| 沈丘县| 通山县| 家居| 门源| 乌兰浩特市| 尼勒克县| 金阳县| 黔南| 邢台县| 平乡县| 策勒县| 化州市| 南投市| 江华| 永春县| 怀化市| 东光县| 彭山县| 棋牌| 邵阳市| 万山特区| 鸡西市| 昭苏县| 遂宁市| 安泽县| 昌邑市| 富锦市| 东方市| 万年县| 开化县|