我有许多具有循环依赖关系的流。
import input from './input'
const streamA = input.thru( someUsageOf_streamC );
const streamB = input.thru( someOtherUsageOf_streamC );
const streamC = most.merge(
streamA.constant('A'),
streamB.constant('B'),
);
传递的函数用于.thru(...)
获取流并应用一些运算符组合,例如.filter()
, .map()
,.until()
但是,值得注意的是(请参见下文了解原因),.delay()
.
这些是我已经尝试过的事情:
方法一
const someUsageOf_StreamC = streamX =>
streamX.sample( (x,c) => [x,c], streamX, streamC )
.filter( ([x,c]) => c === 'something' )
.map( ([x,c]) => x );
这里的问题是您必须预先将流传递给采样,但streamC
不能在streamA
and之前声明streamB
。
方法 2(或 1.1)
import { subject } from 'most-subject'
const streamC = subject();
const streamA = ...;
const streamB = ...;
const streamC_proxy = most.merge( /* ...as above... */ );
streamC_proxy.subscribe( streamC );
此方法建立在方法 1 的基础上,但只是代理可以使用most-subjectstreamC_proxy
预先声明的事件。streamC
我认为这确实有效,但无法使用most-test 进行测试(它需要使用自己的调度程序,但.subscribe()
/.observe()
隐式使用defaultScheduler
)。正如我所说,我使用.delay()
并等待几秒钟/几分钟来运行测试 - 使用默认调度程序 - 是不可行的。
方法三
import hold from '@most/hold'
const someUsageOf_StreamC = streamX =>
streamX.flatMap( x => streamC.take(1) // @most/hold
.filter( c => c === 'something' )
.constant(x) )
.multicast();
const streamA = ...;
const streamB = ...;
const streamC = most.merge( ... ).thru( hold );
除了这段代码远非理想之外,它应该可以工作。但它没有:(
问题
这可以以可测试的方式完成吗?