2

through2文档中:

你需要这个吗?

自从 Node.js 引入了 Simplified Stream Construction 之后,through2 的很多用法就变得多余了。考虑您是否真的需要使用 through2 或只想使用“可读流”包或核心“流”包(派生自“可读流”)。

如果我理解正确,现在(从 2021 年开始)我们可以在没有第三方库的情况下干预流。我没有找到与Stream 文档through2中相同的方法。

// ...
  .pipe(through2(function (file, encoding, callback) {
    // Do something with file ...
    callback(null, file)
   }))

// ↑ Possible to reach the same effect natively (with core packages)?

我想,对于 2021 年,一定有一些方法支持 async/await 语法:

// ...
  .pipe(newFeatureOfModernNodeJS(async function (file) {

    await doSomethingAsyncWithFile(file);
    // on fail - same effect as "callback(new Error('...'))" of trough2

    return file; // same effect as "callback(null, file)" of trough2

    // or
    return null; // same effect as `callback()` of trough2
   }))

// ↑ Possible to reach the same effect natively (with core packages)?
4

1 回答 1

3

您正在寻找的可能是一个转换流,它由 Node.js 中包含的本机“流”库实现。我还不知道是否有异步兼容版本,但肯定有一个基于回调的版本。您需要从本机 Transform 流继承并实现您的功能。

这是我喜欢使用的样板:

const Transform = require('stream').Transform;
const util      = require('util');

function TransformStream(transformFunction) {
  // Set the objectMode flag here if you're planning to iterate through a set of objects rather than bytes
  Transform.call(this, { objectMode: true });
  this.transformFunction = transformFunction;
}

util.inherits(TransformStream, Transform);

TransformStream.prototype._transform = function(obj, enc, done) {
  return this.transformFunction(this, obj, done);
};

module.exports = TransformStream;

现在你可以在你会使用的地方使用它:

const TransformStream = require('path/to/myTransformStream.js');
//...
.pipe(new TransformStream((function (file, encoding, callback) {
    // Do something with file ...
    callback(null, file)
 }))
于 2021-02-10T17:52:31.623 回答