歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

通過異步迭代簡化Node.js流程

來源:本站整理 作者:佚名 時間:2019-12-08 TAG: 我要投稿

如果我們使用異步迭代,那么使用Node.js流程將更加高效。
異步迭代和異步生成器
異步迭代是用于異步檢索數據容器內容的協議,這也意味著當前“任務”可以在檢索項目之前被暫停。
異步生成器有助于異步迭代,如下所示,就是一個異步生成器函數:
/**
 * @returns an asynchronous iterable
 */
async function* asyncGenerator(asyncIterable) {
  for await (const item of asyncIterable) { // input
    if (···) {
      yield '> ' + item; // output
    }
  }
}
for-await-of循環遍歷輸入asyncIterable,這個循環在普通的異步函數中也可用。另外,yield將值輸入到此生成器返回的異步迭代中。
接下里,請密切關注以下函數是異步函數還是異步生成器函數:
/** @returns a Promise */
async function asyncFunction() { /*···*/ }
/** @returns an async iterable */
async function* asyncGeneratorFunction() { /*···*/ }
Node.js支持多種流程,例如:
1.可讀流程(Readable stream)是我們可以從中讀取數據的流程,換句話說,它們是數據的源頭。比如可讀的文件流程,它允許我們讀取文件的內容。
2.可寫流程(Writable stream)是我們可以寫入數據的流程,換句話說,它們是數據的接收器。比如可寫的文件流程,它允許我們將數據寫入文件。
3.轉換流程(transform stream)既可讀又可寫,作為可寫流程時,它接收數據片段,對其進行轉換,更改或刪除它們,然后將它們作為可讀流程輸出。
流水線技術(Pipelining)
計算機中的流水線是把一個重復的過程分解為若干個子過程,每個子過程與其他子過程并行進行。由于這種工作方式與工廠中的生產流水線十分相似, 因此稱為流水線技術。從本質上講,流水線技術是一種時間并行技術。
要在多個步驟中處理流程數據,即可使用流水線技術:
1.通過可讀的流程接收輸入;
2.每個處理步驟都是通過轉換流程執行的;
3.對于最后一個處理步驟,我們有兩個選項:
3.1我們可以將最近的可讀流程中的數據寫入可寫流程,也就是說,可寫流程是流水線上的最后一個進程。
3.2我們可以以其他方式處理最近的可讀流程中的數據;
其中,第2個選項是可選的。
文本編碼
當創建文本流程時,最好一直指定一個編碼:
Node.js文檔有一個支持編碼和默認拼寫的列表,如下所示:
'utf8'
'utf16le'
'base64'
也可以使用一些不同的拼寫,你可以使用Buffer.isEncoding()來檢查哪些是:
> buffer.Buffer.isEncoding('utf8')
true
> buffer.Buffer.isEncoding('utf-8')
true
> buffer.Buffer.isEncoding('UTF-8')
true
> buffer.Buffer.isEncoding('UTF:8')
false
編碼的默認值是null,它相當于'utf8'。
輔助函數:readableToString() 
有時候,我們會使用以下輔助函數。不過在本文中,你不需要具體了解它是如何工作的,大致了解既可。
import * as stream from 'stream';
/**
 * Reads all the text in a readable stream and returns it as a string,
 * via a Promise.
 * @param {stream.Readable} readable
 */
function readableToString(readable) {
  return new Promise((resolve, reject) => {
    let data = '';
    readable.on('data', function (chunk) {
      data += chunk;
    });
    readable.on('end', function () {
      resolve(data);
    });
    readable.on('error', function (err) {
      reject(err);
    });
  });
}
這個函數是通過基于事件的API實現的,稍后我們將看到一種更簡單的方法,即通過異步迭代方法。
在這篇文章中,我們將只使用文本流程。
在這些示例中,我們偶爾會遇到在頂層使用await的情況。在本文的示例中,我們假設我們在模塊內部或異步函數的主體內部。
每當有換行符時,我們都會使用以下函數:
Unix: '\n' (LF)
Windows: '\r\n' (CR LF)
可以通過模塊os中的常量EOL訪問當前平臺的換行符
可讀的流程
創建可讀的流程
可以從文件中創建可讀的流程,具體來說,我們可以使用fs.createReadStream()來創建可讀的流程:
import * as fs from 'fs';
const readableStream = fs.createReadStream(
  'tmp/test.txt', {encoding: 'utf8'});
assert.equal(
  await readableToString(readableStream),
  'This is a test!\n');
Readable.from():通過可迭代器創建可讀流程
靜態方法readable .from(iterable, options?)可以創建一個可讀的流程,該流程包含可迭代器中包含的數據?傻梢允峭降,也可以是異步迭代的。參數選項是可選的,還可以用于指定文本編碼。
import * as stream from 'stream';
function* gen() {
  yield 'One line\n';
  yield 'Another line\n';
}
const readableStream = stream.Readable.from(gen(), {encoding: 'utf8'});
assert.equal(
  await readableToString(readableStream),
  'One line\nAnother line\n');
通過字符串創建可讀的流程
Readable.from() 接受任何可迭代的對象,同時也可以用來將字符串轉換成流程:
import {Readable} from 'stream';
const str = 'Some text!';
const readable = Readable.from(str, {encoding: 'utf8'});
assert.equal(
  await readableToString(readable),

[1] [2] [3]  下一頁

【聲明】:黑吧安全網(http://www.650547.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        安徽快3自由的百科 50万可以融资多少 吉林11选5前三组选 今日股市暴跌四大原因 广东快乐10分官方电话 正规配资网上上盈怎么样 十一选五稳赚技巧 秒速时时彩官网 今天快乐扑克的开奖 好运快三合法吗 魔法师计划免费下载