节点流捕获Promise的错误?

时间:2018-01-05 21:02:42

标签: node.js promise stream

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'返回结果?

2 个答案:

答案 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);
    });