翻譯:瘋狂的技術宅舉個例子,假設有乙個函式原文:
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迴...