Gulp管道中未调用`on(“end”)`处理程序的原因通常是什么?

e1xvtsh3  于 2023-04-27  发布在  Gulp
关注(0)|答案(1)|浏览(312)

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", () => {})。通常是什么原因?

sh7euo9m

sh7euo9m1#

请注意,除非数据被完全消耗,否则不会触发'end'事件。这可以通过切换到流模式或重复调用stream.read()来完成,直到到达end event-end

相关问题