У меня есть пары событий: _1 _ / _ 2_ / etc и _3 _ / _ 4_ / etc. Я бы хотел следующее:
- when an
add1
is emitted on the stream- if
DELAY
transpires with no newadd*
emissions- emit
remove1
- emit
- if
add*
is emitted- emit
remove1
foradd1
immediately - испустить
remove*
дляadd*
послеDELAY
- emit
- if
Это должно продолжаться для всех выбросов add*
в потоке.
Вот тест, который я написал с использованием мраморного тестирования RxJS для этого случая:
import test from 'tape'
import { set, lensPath } from 'ramda'
import { TestScheduler } from 'rxjs/testing'
import hideAfterDelay from '../another/file'
import { actionCreators } from '../another/dir'
const prefix = 'epics -> notifications'
test(`${prefix} -> hideAfterDelay`, t => {
t.plan(1)
const scheduler = new TestScheduler(t.deepEqual)
const actionMap = {
a: createAddAction('hello!'),
b: createAddAction('goodbye!'),
x: actionCreators.notifications.remove('hello!'),
y: actionCreators.notifications.remove('goodbye!')
}
scheduler.run(({ cold, expectObservable }) => {
const actionStream = cold('a-------a-b-a------', actionMap)
const expected = '-----x-----x-y----x'
const actual = hideAfterDelay(5)(actionStream)
expectObservable(actual).toBe(expected, actionMap)
})
})
function createAddAction (name) {
const action = actionCreators.notifications.add(name)
const lens = lensPath(['payload', 'id'])
return set(lens, name, action)
}
Я думаю, что тест является репрезентативным для описанного выше поведения, которого я хочу.
Как я могу написать это наблюдаемое? Я пробовал использовать timer
и race
, но мне не удалось заставить это работать ...
Это эпопея с использованием redux-observable, кстати.
Использование RxJS v6