node.js Stream Buffer FsPromise

來源:互聯網
上載者:User

標籤:llb   nbsp   turn   var   his   sources   tab   fill   file   

Stream:

  類似這樣:a.pipe(b).pipe(c); 我想寫一個b。所以:

var rs=new (require(‘stream‘).Readable)();var ws=new (require(‘stream‘).Writable)();rs._read=function(){  this.push(‘send a msn for the first time‘);  this.push(‘send a msn for the second time‘);  this.push(null);    }ws._wirte=function(chunk,encoding,next){  console.log(chunk.toString());  next()}var Duplex=function(){  let duplex= new (require(‘stream‘).Duplex)();  duplex._read=function(){     this.push(null);  }  duplex._write=function(chunk,e,callback){     this.push(chunk.toString()+‘...by ztw‘);     next()   }   return duplex;}var myDuplex=Duplex();rs.pipe(myDuplex).pipe(ws);

  最後正常顯示:

Buffer:

 先說概念:

  Unicode定義碼點,utf8配置位元組如何對應碼點。

  Buffer,你能看到是Unicode 16進位碼的形式儲存。

  Buffer[0],這種返回的是10進位的Unicode碼,這和‘string‘.charCodeAt(0)是一樣的。

  JS對4位元組的Unicode碼支援不好,‘string‘.length不對。使用:[...‘string‘].length。

var buffer=new Buffer(‘Buffer Test‘,‘utf8‘);buffer.toString(‘utf8‘,0,4);   // ‘Buff‘   位置按buffer內的位置算,非String的位置。buffer.copy(buffer2, targetStart, sourceStart, sourceEnd) ;      // 說形象點,按照[sourceStart,sourceEnd]對buffer進行裁剪,並從buffer2的targetStart位置,開始替換。buffer.fill(‘shit‘ ,  sourceStart, sourceEnd );  //使用shit在buffer的裁剪地區進行填充,填充方式為:repeat;           buffer.fill(‘shit‘) //全部填充buffer.write(‘strawberry‘, start,end);   //替換某個位置。Buffer.concat([buf1,buf2]); //合并兩個Buffer;

  詳見官方API;

JS中有原生的buffer支援,ArrayBuffer,舉個例子:

var arryBuffer=new ArrayBuffer(10);   //Buffer,擁有10個位元組的容量。var arr1=new Int8Array(arryBuffer);    //每個Int8Array(Unit8Array...)都帶有一個ArrayBuffer。這裡顯示申明了而已。我們可以這樣獲得它:var buf=arr1.buffer;   //buf指向arryBuffer,兩者是一樣的。var arr2=new Int8Array(buf) ; //arr2與arr1使用同一空間,二者關聯,值也相同。var arr2=new Int8Array(buf.slice(5)); //只將5以後的空間分配給arr2,而arr1仍然全部佔有。new Buffer(buf) //可以得到這個Buffer。只能在nodeJs端使用。buf.typeLength  // 返回buf的位元組容量大小。

  

 

FsPromise:

  nodeJS沒有提供FS的promise模組,需要自己封裝:

function fsPromise(method){  return function(...args){    return new Promise((resolve,reject)=>{         method.apply(method,args.concat([(err,data)=>{resolve(data)}]))     })  }  }

  寫一個最簡單直接的,其他功能可以在這基礎上變通。

  最後使用:

  fsPromise(fs.readFile)(‘fileName‘,‘utf8‘).then(val=>console.log(val));

 

FsPromise為了跳出callBack的嵌套。還可以這樣:

function thunkify(method){    return function(){      return function(...args){             return function(fn){                 method.call(method,...args,fn);  //相同於 method.apply(method, args.concat[fn]);              };          }      }}           

  先想定義一個thunkify;再接著寫:

var readFile=thunkify(fs.readFile);var FsGen=function* (){     yield readFile(‘fileOne‘,‘utf8‘);     yield readFile(‘fileTwo‘,‘utf8‘);}var fg=FsGen();nextFile();              //調用nextFile,按順序非同步讀取檔案。function nextFile(err,data){    let result=fg.next();    data?console.log(data):0;    if(!result.done) result.value(nextFile);}

  同樣跳出callback嵌套。而generators 配合thunkify函數,可以非同步處理更多的檔案。

node.js Stream Buffer FsPromise

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.