Круговые зависимости с наблюдаемыми

У меня есть несколько потоков, которые имеют циклические зависимости.

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

Проблема здесь заключается в том, что вы должны передать потоки для выборки заранее, но streamC не может быть объявлено раньше streamA а также 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 который может быть объявлен заранее с использованием наиболее предмета.

Я думаю, что это на самом деле работает, но это не тестируется с использованием большинства тестов (это требует использования своего собственного планировщика, но .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 );

Помимо того, что этот код далек от идеала, он должен работать. Но это не так:(

Вопрос

Можно ли это сделать тестируемым способом?

0 ответов

Другие вопросы по тегам