日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

node.js Stream Buffer FsPromise

發(fā)布時(shí)間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 node.js Stream Buffer FsPromise 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Stream:

  類似這樣:a.pipe(b).pipe(c); 我想寫一個(gè)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定義碼點(diǎn),utf8配置字節(jié)如何對(duì)應(yīng)碼點(diǎn)。

  Buffer,你能看到是Unicode 16進(jìn)制碼的形式儲(chǔ)存。

  Buffer[0],這種返回的是10進(jìn)制的Unicode碼,這和'string'.charCodeAt(0)是一樣的。

  JS對(duì)4字節(jié)的Unicode碼支持不好,'string'.length不對(duì)。使用:[...'string'].length。

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

  詳見官方API;

JS中有原生的buffer支持,ArrayBuffer,舉個(gè)例子:

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

  

?

FsPromise:

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

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

  寫一個(gè)最簡(jiǎn)單直接的,其他功能可以在這基礎(chǔ)上變通。

  最后使用:

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

?

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

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

  先想定義一個(gè)thunkify;再接著寫:

var readFile=thunkify(fs.readFile); var FsGen=function* (){yield readFile('fileOne','utf8');yield readFile('fileTwo','utf8'); }var fg=FsGen(); nextFile(); //調(diào)用nextFile,按順序異步讀取文件。function nextFile(err,data){let result=fg.next();data?console.log(data):0;if(!result.done) result.value(nextFile); }

  同樣跳出callback嵌套。而generators 配合thunkify函數(shù),可以異步處理更多的文件。

? ? ? 使用thunkify,為了讓readFile再返回一個(gè)function,并在其中執(zhí)行fg.next()。如果在readFile中執(zhí)行fg.next()。會(huì)返回Generators is aready running;?

?

--------------------------來一個(gè)FsPromise的實(shí)例-----------------------------

function toPromise(method){return function(){return functin(...args){return new Promise((resolve,reject)=>{method(...args,(...data)=>{resolve(data); //把它小小升級(jí)一下,data為array型,以支持不同參型。})})}} }process.stdin.setEncoding('utf8'); const stdinOnce=process.stdin.once.bind(process.stdin);//記得bind;toPromise(stdinOnce)('data').then(val=>{process.stdout.write(...val);console.log('step1');return toPromise(stdinOnce)('data'); }) .then(val=>{process.stdout.write(...val);console.log('step2');return toPromise(stdinOnce)('data'); }) .then(val=>{console.log('end');process.stdout.end(); })

  實(shí)現(xiàn)一個(gè),按步驟根據(jù)用戶輸入就來進(jìn)行回應(yīng)的,大致框架。

? ? ?因?yàn)閒s.readFile本身是一個(gè)obj,所以可以直接toPromise(fs.readFile)。

  而process.stdin.one是一個(gè)方法,直接另名為stdinOnce,會(huì)丟失內(nèi)部的this。

  而使用method.call(process.stdin),也不可取。

  所以:

const stdinOnce=process.stdin.once.bind(process.stdin);

轉(zhuǎn)載于:https://www.cnblogs.com/ztwBlog/p/6257231.html

總結(jié)

以上是生活随笔為你收集整理的node.js Stream Buffer FsPromise的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。