如何响应JavaScript TransformStream输入(可读)端的流错误?
如何响应TransformStream输入端的流错误?
JavaScript TransformStream 对各类流事件的获取与触发方式如下:
| 事件类型 | 获取方式 | 触发方式 |
|---|---|---|
| 流块(Stream chunk) | TransformStream构造函数中的transform方法 | controller.enqueue() |
| 流结束(Stream end) | TransformStream构造函数中的flush方法 | controller.terminate() |
| 流错误(Stream error) | ??? | controller.error() |
TransformStream 默认会将输入(可写)流的事件转发到输出(可读)流,你可以通过上表中的方法自定义行为。但目前的问题是:当输入流出现错误时,无法直接通过构造函数的回调捕获它,进而无法实现“触发副作用”或“阻止错误转发”这类自定义逻辑。
解决方法
TransformStream 本身没有在构造函数中提供捕获输入流错误的回调,但可以通过以下两种方式处理:
1. 监听TransformStream实例的writable属性的error事件
TransformStream的writable是可写流,当输入端发生错误时,这个流会触发error事件,你可以在这里执行副作用,也能手动控制错误是否转发到输出流。
const transformStream = new TransformStream({ transform(chunk, controller) { controller.enqueue(chunk); } }); // 监听输入流错误 transformStream.writable.addEventListener('error', (error) => { // 执行自定义副作用逻辑 console.error('输入流发生错误,触发副作用:', error); // 若不想让错误转发到输出流,可手动终止输出流 // transformStream.readable.cancel('已处理输入流错误,终止输出'); }); // 模拟输入流错误场景 const writer = transformStream.writable.getWriter(); writer.abort(new Error('输入流出现异常'));
2. 在输入流(源流)上直接监听错误
如果是将某个可读流通过pipeThrough传入TransformStream,也可以直接给源流添加error监听,在错误发生时执行自定义逻辑:
// 模拟一个会出错的源流 const sourceStream = new ReadableStream({ start(controller) { controller.error(new Error('源流触发错误')); } }); const transformStream = new TransformStream({ transform(chunk, controller) { controller.enqueue(chunk); } }); // 将源流通过TransformStream导向目标流 sourceStream.pipeThrough(transformStream).pipeTo(destinationStream); // 监听源流(输入流)的错误 sourceStream.addEventListener('error', (error) => { console.error('输入流错误:', error); // 执行副作用操作 });
需要注意:默认情况下,输入流的错误会自动转发到TransformStream的输出流。如果要阻止转发,需要在错误处理逻辑中手动终止输出流(如调用transformStream.readable.cancel())。
内容的提问来源于stack exchange,提问作者cdauth
相关产品推荐
相关产品推荐

