慕哥6287543
2023-08-10 14:39:40
您好,我試圖了解以下代碼中發(fā)生的情況:import fs from "fs";import util from "util";import split2 from "split2";async function main() { const files = await fs.promises.readdir(".."); for (const f of files) { const s = fs.createReadStream("../" + f); const ss = s.pipe(split2()); s.on("error", (err) => { console.log(err); }); for await (const l of ss) { } console.log(f); } console.log("Returning"); return "Done";}main();它基本上讀取目錄中的每個(gè)文件并迭代每個(gè)文件的行(通過使用 forawait 語法將可讀流通過管道輸送到 split2 庫中。問題是,當(dāng)文件確實(shí)是目錄時(shí),createReadStream 失?。S后什么也沒有發(fā)生)奇怪的是,似乎一個(gè)錯(cuò)誤導(dǎo)致主函數(shù)默默退出并在錯(cuò)誤之前僅顯示幾個(gè)文件名。.gitignoreapp.js[Error: EISDIR: illegal operation on a directory, read] { errno: -21, code: 'EISDIR', syscall: 'read'}如果我只是評(píng)論await for 循環(huán),我會(huì)得到以下輸出。.gitignoreapp.jsbusinesscomponentsconfigenv.skeletronnode_modulespackage-lock.jsonReturning[Error: EISDIR: illegal operation on a directory, read] { errno: -21, code: 'EISDIR', syscall: 'read'}[Error: EISDIR: illegal operation on a directory, read] { errno: -21, code: 'EISDIR', syscall: 'read'}[Error: EISDIR: illegal operation on a directory, read] { errno: -21, code: 'EISDIR', syscall: 'read'}[Error: EISDIR: illegal operation on a directory, read] { errno: -21, code: 'EISDIR', syscall: 'read'}[Error: EISDIR: illegal operation on a directory, read] { errno: -21, code: 'EISDIR', syscall: 'read'}[Error: EISDIR: illegal operation on a directory, read] { errno: -21, code: 'EISDIR', syscall: 'read'}[Error: EISDIR: illegal operation on a directory, read] { errno: -21, code: 'EISDIR', syscall: 'read'}[Error: EISDIR: illegal operation on a directory, read] { errno: -21, code: 'EISDIR', syscall: 'read'} 這確實(shí)是完整的文件列表,并且各個(gè)錯(cuò)誤不會(huì)停止外循環(huán)。我在 Ubuntu 機(jī)器上使用節(jié)點(diǎn) v14.0.0 運(yùn)行它。知道發(fā)生了什么事嗎?我真的迷路了:-D
1 回答

Helenr
TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊
您沒有處理循環(huán)中的錯(cuò)誤for await (const l of ss) {...}
。當(dāng)您嘗試在目錄上運(yùn)行它時(shí),您的for await
循環(huán)將拒絕,并且由于您沒有捕獲或處理該拒絕,因此包含的async
函數(shù)也將拒絕并且程序?qū)⑼V埂?/p>
您可以嘗試在循環(huán)中放置 try/catchfor await
并查看是否有效。但是,我在流功能中發(fā)現(xiàn)了許多錯(cuò)誤for await
,甚至提交了一些錯(cuò)誤。如果打開文件時(shí)出錯(cuò)或讀取文件時(shí)出錯(cuò),則會(huì)出現(xiàn)錯(cuò)誤,因此此功能只是有錯(cuò)誤,因此我決定不在我的代碼中使用它。
另請注意,您沒有一個(gè)好的方法來從事件中傳達(dá)錯(cuò)誤,error
因?yàn)槟鸁o法拒絕async
嵌套事件處理程序內(nèi)部的函數(shù)??傮w而言,流及其事件與基于承諾的編程不能很好地融合。有多種方法可以承諾某些流事件,但要使流與承諾良好配合,還需要進(jìn)行中。
添加回答
舉報(bào)
0/150
提交
取消