我想合并两个相同来源的地图,保证结果的顺序。这是我想通过的单元测试:
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]
答案 0 :(得分:2)
我不是xstream
的专家,因此我无法为您提供解决方案。但是,我想我可以解释为什么你得到你得到的输出,因为这在其他流媒体库中很常见。
您有两个来源的合并。 of
运算符保证它将按顺序发出数组值,map
运算符保证它将以与接收值相同的顺序发出转换后的值等。但是merge(a,b)
不保证它会交换a和b的值。它确实保证它将按顺序传递a的值,b依次传递,即它只保证结果输出的部分顺序。
给定一些要发射的值,在哪个时间发出哪些值以及以何种顺序与调度相关的问题。此时我不知道xstream
公开了一个调度程序接口,您可以从中自定义值的发送计划。因此,您将受到默认计划的约束。
现在回到为什么按顺序观察这些值:
如果要获取未同步发送的值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
。