javascript - 将“end”设置为“false”的流在可写流完成之前解析
问题描述
我写了一个函数,它在管道一个可读流之后返回一个已解决的承诺。有两个管道。第一个管道是转换,第二个管道是可写流。我不想关闭可写流,所以我传入{end:false}
了 writer/pipe 参数。转换和可写流独立工作(即只有一个管道),但当我链接它们时不是。
根据我看到的所有示例,为了知道该过程何时完成,我添加了readable.on('end')
. 它没有按预期工作。
pipe(readable, transform, writable){
return new Promise((resolve, reject) => {
readable
.pipe(transform)
.pipe(writable, {end:false})
.on('error', (error) => {
console.error(error)
reject(error);
})
readable.on('end', () => {
writable.end();
resolve();
});
});
}
- 如果我调用
writable.end()
什么都不会写入文件 - 如果我不称
writable.end()
它实际上完全按照它应该做的那样做,但是它过早地解决了承诺......文件仍在被写入。 - 如果我不使用
{end:false}
并且只是正常执行此操作,它可以正常工作。问题是我希望可写流保持打开状态。
解决方案
在尝试了每个事件之后writable.on('unpipe')
,我需要指示写入已完成的处理程序。
pipe(readable, transform, writable){
return new Promise((resolve, reject) => {
readable
.pipe(transform)
.pipe(writable, {end:false})
.on('unpipe', () => {
resolve();
// this must be called somewhere!
// writable.end();
})
.on('error', (error) => {
console.error(error)
reject(error);
})
});
}
推荐阅读
- php - 在 Laravel 中播种用户配置文件数据的问题
- sql-server - SQL Server:在 SELECT 中的 MAX 语句给出的结果上加入
- documentation - ERR_FILE_NOT_FOUND 创建 Docusaurus 文件时
- python - Pandas - 不同值的滚动累积计数
- javascript - 动态过滤嵌套 javascript 对象数组中的数据
- c# - 如何修复 gRPC 和 C# 的“命名空间名称“故障”的类型在命名空间中不存在”?
- node.js - 如何使用节点 js 使用 botbulilder webex 适配器将 MS Bot 与 Webex 团队集成
- c# - 在 DOM 中选择屏幕外项目的问题(在真实设备和模拟器中)
- objective-c - Objective-C:为什么 int、double、char 等不需要指针来从它们创建对象
- react-native - 如何在本机反应中使用“https”解决此问题?