gpt4 book ai didi

javascript - 如何包装管道流以使其看起来像单个流?

转载 作者:行者123 更新时间:2023-12-03 05:42:22 24 4
gpt4 key购买 nike

我有一个工作流程,如下所示:

gulp.src('**/*.js')
.pipe(doSomething())
.pipe(dest('out'));

我想要 doSomething 返回一个流管道,比如 uglify().pipe(header(...)).pipe(rename(...)) 这样的有效结果是

gulp.src('**/*.js')
.pipe(uglify())
.pipe(header(...))
.pipe(rename(...))
.pipe(dest('out'));

显然 doSomething 无法返回 uglify (因为 dest 会从中读取),并且它无法返回 rename (因为 src 会写入该内容)。所以我的计划是构建一个双工流,它的作用就像这个管道片段的包装器,结果是:

first = uglify();
last = first
.pipe(header(...))
.pipe(rename(...));

gulp.src('**/*.js')
.pipe(wrapper(first, last) /* writes go to first, reads go to last */)
.pipe(dest('out'));

我尝试过编写一个包装器,但我没有足够的 Node Stream 经验来知道我正在走正确的道路,以及为什么它不起作用。这是我到目前为止所得到的:

var encapsulateStream = function(first, last, logger) {
logger('encapsulate');
let resultStream = new Duplex({
readableObjectMode: true,
writableObjectMode: true,
read(size) {
logger('read');
while (true) {
let chunk = last.read(size);
if (logger) logger('[in]', '--->', chunk);
if (!this.push(chunk) || chunk === null) {
return;
}
}
},
write(chunk, enc, next) {
logger('write');
if (logger) logger('--->', '[first]', chunk);
first.write(chunk, enc, next);
}});

resultStream.on('finish', function() {
logger('finish');
first.end();
forwardStream(last, resultStream, logger);
});

return resultStream;
};

我的日志中显示“封装”,但没有其他内容。我哪里出错了,这是正确的方法吗?

最佳答案

没有必要自己实现这样的事情。 lazypipe库被广泛使用并且几乎完全符合您的要求。

这是一个简单的示例,说明了它在您的用例中的用法:

var lazypipe = require('lazypipe');

var doSomething = lazypipe()
.pipe(uglify)
.pipe(header, ...)
.pipe(rename, ...);

gulp.src('**/*.js')
.pipe(doSomething())
.pipe(gulp.dest('out'));

关于javascript - 如何包装管道流以使其看起来像单个流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40477667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com