在 JavaScript 中優雅的提取迴圈內的資料

2021-09-12 18:58:09 字數 1323 閱讀 7927

翻譯:瘋狂的技術宅

原文:

舉個例子,假設有乙個函式logfiles()

const fs = require('fs');

const path = require('path');

function logfiles(dir)

}}logfiles(process.ar**[2]);

從 a 行開始的迴圈用來記錄檔案路徑。它是for-of迴圈和遞迴的組合(遞迴呼叫在 b 行)。

如果你發現迴圈內的某些資料(迭代檔案)有用,但又不想記錄它,那應該怎麼辦?

提取迴圈內資料的第乙個方法是內部迭代:

const fs = require('fs');

const path = require('path');

function logfiles(dir, callback)

}}logfiles(process.ar**[2], p => console.log(p));

這種迭代方式與array的.foreach()類似:logfiles()內實現迴圈並對每個迭代值(行a)呼叫callback

內部迭代的替代方案是外部迭代:我們實現了乙個iterable,可以用生成器幫助我們實現:

const fs = require('fs');

const path = require('path');

function* logfiles(dir)

}}for (const p of logfiles(process.ar**[2]))

如果是內部迭代,logfiles()會呼叫我們(「推」給我們)。而這一次,換我們來呼叫它了(「拉」過來)。

請注意,在生成器中,必須通過yield*進行遞迴呼叫(第a行):如果只呼叫logfiles()那麼它會返回乙個iterable。但我們想要的是在該 iterable 中yield每個專案。這就是yield*的作用。

生成器有乙個非常好的特性,就是處理過程能夠與內部迭代一樣互鎖:每當logfiles()建立另乙個filepath時,我們能夠立即檢視它,然後logfiles()繼續。這是一種簡單的協作式多工處理,其中yield暫停當前任務並切換到另乙個任務。

在 JavaScript 中優雅的提取迴圈內的資料

翻譯 瘋狂的技術宅 原文 2ality.com 2018 04 ext 舉個例子,假設有乙個函式logfiles const fs require fs const path require path function logfiles dir logfiles process.ar 2 複製 從 ...

在 JavaScript 中優雅的提取迴圈內的資料

翻譯 瘋狂的技術宅 原文 舉個例子,假設有乙個函式logfiles const fs require fs const path require path function logfiles dir logfiles process.ar 2 從 a 行開始的迴圈用來記錄檔案路徑。它是for of迴...

在 JavaScript 中優雅的提取迴圈內的資料

翻譯 瘋狂的技術宅 原文 舉個例子,假設有乙個函式logfiles const fs require fs const path require path function logfiles dir logfiles process.ar 2 從 a 行開始的迴圈用來記錄檔案路徑。它是for of迴...