我有一個生成器,一次可以傳輸一行大檔案。我只想一次處理一行,檔案大小可能會變得非常大。
export async function *lineOfFileGenerator(fullFilePath: string) {
const filestream = createReadStream(fullFilePath);
const rl = createInterface({
input: filestream,
crlfDelay: Infinity
});
for await (const line of rl) {
yield line;
}
}
然后被實體化
const gen = lineOfFileGenerator('./path/to/file')
我想繼續呼叫這個生成器(它回傳一個承諾),直到它“完成”。由于它回傳一個承諾,我無法回圈并直接檢查 done 布林值是否為真。我做了一個遞回函式
function genPrinter(geno: any): void | AsyncGeneratorFunction {
geno.next().then((val: { done: boolean; value: string; }) => {
if (val.done) {
console.log('done');
return;
}
// will eventually call a processing function.
console.log(val.value);
});
return genPrinter(geno);
}
但是,我得到RangeError: Maximum call stack size exceeded.
我不確定呼叫此生成器/解決此問題的最佳方法。
uj5u.com熱心網友回復:
遞回函式期望某些條件退出。在您的情況下,您genPrinter無休止地呼叫,在這種情況下,您不需要遞回函式,只需一個await..for回圈即可完成作業。在這里,我稍微重構了您的代碼:
async function genPrinter(geno: any) {
for await (let val of geno) {
console.log('value:', val);
}
console.log('done');
}
如果你仍然想做同樣的事情,在你的方法中試試這個:
async function genPrinter(geno: any): void | AsyncGeneratorFunction {
let { done, value } = await geno.next();
if (done) {
console.log('done');
return;
}
console.log(value);
return genPrinter(geno);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/337437.html
上一篇:遞回二分查找,切片二分法
下一篇:Peg紙牌解決方案更改目的地
