Если я правильно понимаю, основными потоками событий являются mousemove
и mousedown
.
На основе этих потоков событий вы должны рассчитать новый поток a
, который излучает ста же частота mousemove
, но чьи данные являются результатом некоторых вычислений, основанных на текущем положении мыши и значении a
, которое имело при последнем излучении mousedown
.
Итак, если этоправда, мы можем смоделировать mousemove
и mousedown
с помощью следующих наблюдаемых
// the mouse is clicked every 1 second
const c = interval(1000).pipe(
tap(cVal => console.log('click', cVal))
);
// the mouse moves diagonally and emits every 200 ms
const m = interval(200).pipe(
map(mVal => [mVal, mVal]),
);
Нам нужно как-то иметь под рукой значение Наблюдаемой a
, когда mousedown
излучает.Как мы можем получить это?
Давайте предположим, что у нас есть BehaviourSubject
с именем value_of_a
, начальное значение которого 1
и которое содержит значение a
.Если бы у нас было такое Observable, мы могли бы получить его значение, когда mousedown
излучает просто так
const last_relevant_a = c.pipe( // when mousedown emits
switchMap(() => value_of_a.pipe( // the control is switched to the Observable value_of_a
take(1), // and we consider only its first value
)),
);
С m
, Observable при перемещении мыши и last_relevant_a
у нас есть все Observable, которые нам нужны,Фактически нам нужно просто объединить их последние выбросы, чтобы получить все элементы, необходимые для вычисления нового значения a
.
const a = combineLatest(m, last_relevant_a)
.submit(
([mouseVal, old_a_val] => {
// do something to calculate the new value of a
}
);
Теперь осталось только убедиться, что value_of_a
испускает любое значение, испускаемое a
.Это можно сделать, вызвав next
на value_of_a
в рамках самой подписки a
.
Сшивая все вместе, решение может быть примерно таким:
const c = interval(1000).pipe(
tap(cVal => console.log('click', cVal))
);
const m = interval(200).pipe(
map(mVal => [mVal, mVal]),
);
const value_of_a = new BehaviorSubject<number>(1);
const last_relevant_a = c.pipe(
switchMap(cVal => value_of_a.pipe(
take(1),
)),
);
const a = combineLatest(m, last_relevant_a);
a.pipe(
take(20)
)
.subscribe(
val => {
// new value of a calculated with an arbitrary logic
const new_value_of_a = val[0][0] * val[0][1] * val[1];
// the new value of a is emitted by value_of_a
value_of_a.next(new_value_of_a);
}
)
Возможно, этотакже вариант использования для оператора expand
, но его следует изучить.