如何订购流合并?

时间:2017-10-14 16:11:10

标签: xstream-js

我想合并两个相同来源的地图,保证结果的顺序。这是我想通过的单元测试:

  const source = xs.of(1,2,3)
  const a = source.map(v=>v*10)
  const b = source.map(v=>v*100)
  const hist:number[] = []
  xs.merge(a,b).addListener({
    next: v=>hist.push(v),
  })
  expect(hist).toEqual([10,100,20,200,30,300])

目前,我得到的结果是:

Expected value to equal:
  [10, 100, 20, 200, 30, 300]
Received:
  [10, 20, 30, 100, 200, 300]

2 个答案:

答案 0 :(得分:2)

我不是xstream的专家,因此我无法为您提供解决方案。但是,我想我可以解释为什么你得到你得到的输出,因为这在其他流媒体库中很常见。

您有两个来源的合并。 of运算符保证它将按顺序发出数组值,map运算符保证它将以与接收值相同的顺序发出转换后的值等。但是merge(a,b)不保证它会交换a和b的值。它确实保证它将按顺序传递a的值,b依次传递,即它只保证结果输出的部分顺序。

给定一些要发射的值,在哪个时间发出哪些值以及以何种顺序与调度相关的问题。此时我不知道xstream公开了一个调度程序接口,您可以从中自定义值的发送计划。因此,您将受到默认计划的约束。

现在回到为什么按顺序观察这些值:

  • merge(a,b)首先连接到a
    • a立即同步发出数组中的所有值
  • 合并(a,b)然后连接到b
    • b立即同步发出数组中的所有值

如果要获取未同步发送的值1,2,3,则需要使用除of之外的其他运算符来执行此操作,或者明确构造定时序列,即在t0处发出1,在t0 + 1,3,t0 + 2。

答案 1 :(得分:2)

user3743222's answer获取线索,使用periodic对列表进行排序。

更改:

//const source = xs.of(1,2,3)
const source = xs.periodic(1).drop(1).take(3)

...在控制台中生成:

10 100 20 200 30 300

ESNextbin演示。

drop(1)是从periodic开始处理0的一种方法。也可以在++v*10函数中使用map