【问题标题】:Node stream catch Promise's error?节点流捕获 Promise 的错误?
【发布时间】:2018-01-05 21:02:41
【问题描述】:
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'返回结果?

【问题讨论】:

  • 你知道data事件可以被多次调用吗?如果是这样,当somePromise(data)被多次调用时,你想返回什么。

标签: node.js promise stream


【解决方案1】:

你可以捕捉到一些Promise,比如:

.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)));
}

【讨论】:

    【解决方案2】:

    流不会捕获错误 - 因此,您可以像 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);
        });
    

    【讨论】:

      猜你喜欢
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 2019-04-04
      • 1970-01-01
      相关资源
      最近更新 更多