3

循環依存関係を持つ多数のストリームがあります。

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

ここでの問題は、前もってサンプルにストリームを渡す必要がありますが、and のstreamC前に宣言できないことです。streamAstreamB

方法 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-subjectを使用して事前に宣言できるイベントstreamC_proxyをプロキシするだけです。streamC

これは実際に機能すると思いますが、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 );

このコードが理想からかけ離れていることを除けば、うまくいくはずです。しかし、そうではありません:(

質問

これはテスト可能な方法で行うことができますか?

4

0 に答える 0