偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

結(jié)合異步迭代器實(shí)現(xiàn) Node.js 流式數(shù)據(jù)復(fù)制

開(kāi)發(fā) 前端
實(shí)現(xiàn)可讀流到可寫(xiě)流數(shù)據(jù)復(fù)制,就是不斷的讀取->寫(xiě)入這個(gè)過(guò)程,那么你首先想到的是不是下面這樣呢?代碼看似很簡(jiǎn)單,結(jié)果卻是很糟糕的,沒(méi)有任何的數(shù)據(jù)積壓處理。

[[422219]]

實(shí)現(xiàn)可讀流到可寫(xiě)流數(shù)據(jù)復(fù)制,就是不斷的讀取->寫(xiě)入這個(gè)過(guò)程,那么你首先想到的是不是下面這樣呢?代碼看似很簡(jiǎn)單,結(jié)果卻是很糟糕的,沒(méi)有任何的數(shù)據(jù)積壓處理。如果讀取的文件很大了,造成的后果就是緩沖區(qū)數(shù)據(jù)溢出,程序會(huì)占用過(guò)多的系統(tǒng)內(nèi)存,拖垮服務(wù)器上的其它應(yīng)用,如果不明白的回顧下這篇文章 Node.js Stream 背壓 — 消費(fèi)端數(shù)據(jù)積壓來(lái)不及處理會(huì)怎么樣?。

  1. // 糟糕的示例,沒(méi)有數(shù)據(jù)積壓處理 
  2. readable.on('data', data => { 
  3.   writable.write(data) 
  4. }); 

類(lèi)似以上的需求,推薦你用 pipe() 方法以流的形式完成數(shù)據(jù)的復(fù)制。

作為學(xué)習(xí),結(jié)合異步迭代器以一種簡(jiǎn)單的方式實(shí)現(xiàn)一個(gè)類(lèi)似于 pipe 一樣的方法完成數(shù)據(jù)源到目標(biāo)源的數(shù)據(jù)復(fù)制。

數(shù)據(jù)寫(xiě)入方法實(shí)現(xiàn)

_write 方法目的是控制可寫(xiě)流的數(shù)據(jù)寫(xiě)入,它返回一個(gè) Promise 對(duì)象,如果可寫(xiě)流的 dest.write() 方法返回 true,表示內(nèi)部緩沖區(qū)未滿(mǎn),繼續(xù)寫(xiě)入。

當(dāng) dest.write() 方法返回 false 表示向流中寫(xiě)入數(shù)據(jù)超過(guò)了它所能處理的最大能力限制,此時(shí)暫停向流中寫(xiě)入數(shù)據(jù),直到 drain 事件觸發(fā),表示緩沖區(qū)中的數(shù)據(jù)已排空了可以繼續(xù)寫(xiě)入,再將 Promise 對(duì)象變?yōu)榻鉀Q。

  1. function _write(dest, chunk) { 
  2.   return new Promise(resolve => { 
  3.     if (dest.write(chunk)) { 
  4.       return resolve(null); 
  5.     } 
  6.  
  7.     dest.once('drain', resolve); 
  8.   })   

結(jié)合異步迭代器實(shí)現(xiàn)

異步迭代器使從可讀流對(duì)象讀取數(shù)據(jù)變得更簡(jiǎn)單,異步的讀取數(shù)據(jù)并調(diào)用我們封裝的 _write(chunk) 方法寫(xiě)入數(shù)據(jù),如果緩沖區(qū)空間已滿(mǎn),這里 await _write(dest, chunk) 也會(huì)等待,當(dāng)緩沖區(qū)有空間可以繼續(xù)寫(xiě)入了,再次進(jìn)行讀取 -> 寫(xiě)入。

  1. function myCopy(src, dest) { 
  2.   return new Promise(async (resolve, reject) => { 
  3.     dest.on('error', reject); 
  4.  
  5.     try { 
  6.       for await (const chunk of src) { 
  7.         await _write(dest, chunk); 
  8.       } 
  9.       resolve(); 
  10.     } catch (err) { 
  11.       reject(err); 
  12.     } 
  13.   }); 

使用如下所示:

  1. const readable = fs.createReadStream('text.txt'); 
  2. const writable = fs.createWriteStream('dest-text.txt'); 
  3. await myCopy(readable, writable); 

本文轉(zhuǎn)載自微信公眾號(hào)「Nodejs技術(shù)棧」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Nodejs技術(shù)棧公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: Nodejs技術(shù)棧
相關(guān)推薦

2021-03-04 23:12:57

Node.js異步迭代器開(kāi)發(fā)

2020-12-08 06:28:47

Node.js異步迭代器

2021-04-06 10:15:29

Node.jsHooks前端

2022-05-05 08:02:44

MongoDBNode.js加密

2025-01-13 00:00:00

2011-12-23 13:58:57

node.js

2021-07-15 10:15:52

Node.jsJSON前端

2021-05-18 09:01:39

Node.jsJSON文件

2013-11-01 09:34:56

Node.js技術(shù)

2015-03-10 10:59:18

Node.js開(kāi)發(fā)指南基礎(chǔ)介紹

2021-03-16 16:16:41

GeneratorWebsockets前端

2024-06-17 08:03:51

2021-07-16 04:56:03

NodejsAddon

2020-10-12 08:06:28

HTTP 服務(wù)器證書(shū)

2021-03-09 08:03:21

Node.js 線(xiàn)程JavaScript

2021-01-26 08:07:44

Node.js模塊 Async

2011-09-09 14:23:13

Node.js

2011-09-02 14:47:48

Node

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)