Node.js流“数据完全消费”含义及Gulp end事件未触发问题
Gulp流中end事件未触发的问题与Node.js文档疑问
背景
此前我曾提问《Gulp管道中on("end")处理器未调用的常见原因?》,仅得到一段Node.js文档复制粘贴的回答,且答主未回复我的澄清评论。因该问题已获采纳无法删除,编辑也难吸引新回答,故重新提问。
实验数据
以下是基于Gulp的标记源代码检查器类简化代码:
import type { TransformCallback } from "stream"; import Stream from "stream"; import VinylFile from "vinyl"; class MarkupSourceCodeLinter { public static provideLintingIfMust( projectBuildingMasterConfigRepresentative: ProjectBuildingMasterConfigRepresentative ): () => NodeJS.ReadWriteStream { const dataHoldingSelfSoleInstance: MarkupSourceCodeLinter = new MarkupSourceCodeLinter(/* */); // ... /* 首次运行 */ return dataHoldingSelfSoleInstance.lint(dataHoldingSelfSoleInstance.targetFilesGlobSelectors); } protected lint(globSelectorsOrAbsolutePathsOfTargetFiles: Array<string>): () => NodeJS.ReadWriteStream { return (): NodeJS.ReadWriteStream => Gulp. src(globSelectorsOrAbsolutePathsOfTargetFiles, { read: false }). // ... pipe(new Stream.Transform({ objectMode: true, transform(chunk: unknown, _encoding: BufferEncoding, callback: TransformCallback): void { console.log("CHECKPOINT1"); if (chunk instanceof VinylFile) { if (VinylFile.isVinyl(chunk)) { console.log(chunk.path); } } callback(null, chunk); } })). on("end", (): void => { console.log("CHECKPOINT2"); }); } private onMarkupSourceFileHasBeenAddedOrUpdated(targetMarkupFileAbsolutePath: string): void { // this.lint([ targetMarkupFileAbsolutePath ])(); } }
问题现象
- 通过公共静态方法
provideLintingIfMust外部调用lint()时,on("end", () => {})处理器会被调用; - 从
onMarkupSourceFileHasBeenAddedOrUpdated调用lint()时,能触发CHECKPOINT1,却无法触发CHECKPOINT2,此时仅处理单个变更文件。
对Node.js文档的疑问
我查阅了之前回答中引用的Node.js文档:
Event: 'end'
当流中无更多数据可消费时,会触发'end'事件。
除非数据被完全消费,否则不会触发'end'事件。可通过切换流为流动模式,或反复调用stream.read()直至数据耗尽来实现。
由此产生以下疑问:
- “数据完全消费”具体指什么?增量运行时仅处理单个文件,但end事件未触发,说明并非指所有文件通过
Gulp.src()。 - “This can be accomplished”中的“This”指代什么?是“end事件不会触发”还是“数据完全消费”?
- “accomplished”是自动完成还是需要手动实现?
stream.read()与Gulp流有何关联?
另外,我未在Node.js文档中找到“流动模式”的明确解释,仅了解流动模式下数据会自动从底层系统读取,但不确定增量构建场景下Gulp.src()调用是否属于自动读取。
内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD
相关产品推荐
相关产品推荐

