return new Promise((resolve, reject) => someReadStream
.pipe(decoder)
.on('data', data => somePromise(data))
.on('end', () => resolve(true))
.on('error', e => reject(e)));
此流无法捕获somePromise引发的错误。 如何捕获流中的Promise错误?
还有什么办法让流通过'somePromise'返回结果?
答案 0 :(得分:1)
你可以像以下一样了解:
.on('data', data => somePromise(data).catch(e => reject(e)))
如果你想返回somePromise结果:
return new Promise((resolve, reject) => {
let results = [];
someReadStream
.pipe(decoder)
.on('data', data => results.push(somePromise(data)))
.on('end', () => resolve(Promise.all(results).catch(e => reject(e))))
.on('error', e => reject(e)));
}
答案 1 :(得分:1)
流不会捕获错误 - 所以你要么积累,就像Andriy2建议的那样(但请记住,如果你经历了大量的数据,你可能会遇到内存消耗问题)或者你使用scramjet像这样的框架:
const {DataStream} = require("scramjet");
return someReadStream
.pipe(decoder)
.pipe(new DataStream())
.consume((data) => somePromise(data))
);
Scramjet非常轻巧,因此您只需添加3个相关模块。
DataStream.prototype.consume
会返回一个Promise,让您的代码更加轻松。 :)
- 编辑 -
在最近的版本中引入了catch
方法,因此您甚至可以根据自己的喜好处理错误 - 甚至解散(通过解析catch
块):
dataStream
.catch(err => {
if (!(err instanceOf DismissableError))
throw err;
logger.error("A dismissable error occured", err);
});