【问题标题】:Peek at first object of stream with highland.js使用 highland.js 查看流的第一个对象
【发布时间】:2016-03-14 14:53:23
【问题描述】:

我想将任意但类似键控的对象流转换为 CSV 字符串流。为了做到这一点,我想查看流中的第一个对象,并为将添加到流中的对象键创建一个标题行。我已经做到了:

// Convert an object to a DSV
// NOTE: Assumes that all objects have the same properties!
export let toDSV = (delimiter=', ') => stream => {
  let headerStream = stream.fork().head().flatMap(x => _.keys(x).collect());

  return headerStream
    .flatMap(headers => {
      return _.sequence([
        _([headers.join(delimiter)]),
        stream.fork()
          .pick(headers)
          .map(_.values)
          .flatMap(_.collect)
          .invoke('join', [delimiter])
      ]);
    });
};

对于以下流

_([{
  foo: 1
  bar: 2
  baz: 3
}, {
  foo: 2
  bar: 1
  baz: 4
}])

结果流应该是:

foo, bar, baz
1, 2, 3
2, 1, 4

虽然我认为fork() 存在背压问题,但仅创建了标题行,其中第一个流未被完全消耗。

那么,我如何“窥视”流的第一个元素,然后根据该信息处理流?

【问题讨论】:

    标签: javascript stream reactive-programming highland.js


    【解决方案1】:

    在我看来,您的问题是您一开始就在stream 上调用.fork()let headerStream = stream.fork()...

    现在几乎就像您拥有stream(a)stream(b),其中return headerStream.flatMap...stream(b) 上运行,stream.fork().pick(headers)... 正在等待您开始在stream(b) 上运行。

    只需取消这两个stream.fork() 调用,您就应该做好准备了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2014-11-18
      • 1970-01-01
      相关资源
      最近更新 更多