与observables的循环依赖关系

时间:2016-11-30 18:37:08

标签: javascript monads reactive-programming mostjs

我有许多具有循环依赖关系的流。

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()

这些是我已经尝试过的事情:

方法1

const someUsageOf_StreamC = streamX =>
    streamX.sample( (x,c) => [x,c], streamX, streamC )
           .filter( ([x,c]) => c === 'something' )
           .map( ([x,c]) => x );

此处的问题是您必须先将流传递到示例,但streamCstreamA之前无法声明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的基础上,但只是将streamC_proxy中的事件代理到streamC,可以使用most-subject预先声明。

我认为这确实有效,但使用most-test无法测试(它需要使用自己的调度程序,但.subscribe() / .observe()隐式使用defaultScheduler )。正如我所说,我使用.delay()并等待秒/分钟运行测试 - 使用默认调度程序 - 是不可行的。

方法3

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

除了这个代码远非理想之外,它应该工作。 But it doesn't :(

问题

这可以以可测试的方式完成吗?

0 个答案:

没有答案