標籤: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