bounty还有6天到期。回答此问题可获得+50声望奖励。Takeshi Tokugawa YD希望引起更多关注此问题。
没有MWE,我不指望有人会回答到底是什么原因在我的情况下。我问的是什么 * 一般 * 可能是原因。知道这一点,我会继续调查自己。
下面不是工作示例,但如果要简化我基于Gulp的标记源代码linter类(目前它有大约750行),它将是:
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(/* */);
// ...
/* First run */
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 ])();
}
}
当lint()
被外部调用时(通过公共静态provideLintingIfMust
),on("end", () => {})
处理程序被调用。但是,当从onMarkupSourceFileHasBeenAddedOrUpdated
调用lint()
时,console.log("CHECKPOINT2");
-no到达检查点console.log("CHECKPOINT1");
。只有一个文件。
我想,我只是不知道什么时候on("end", () => {})
被真正调用。
后续运行的示例输出:
CHECKPOINT1
D:\XXX\FunctionalTests\MarkupProcessing\IncrementalBuilding\01-Source\Com
ponents\Header.pug
只处理了一个文件,但没有调用on("end", () => {})
。通常是什么原因?
1条答案
按热度按时间sh7euo9m1#
请注意,除非数据被完全消耗,否则不会触发'end'事件。这可以通过切换到流模式或重复调用stream.read()来完成,直到到达end event-end