Я изучаю реактивное программирование с помощью RxJS, и у меня есть следующее упражнение:
- Оно начинается с пустого массива
- Когда приложение запускается, новый Date ()вставляется в массив
- Каждый раз, когда вы щелкаете по экрану, в конце массива вводится значение с датой, когда был выполнен щелчок
- Когда массив имеет 3 значения, выполните вычисления: (array [2] .value () + array [1] .value () - array [0])% 2
- Если результат = 0, выведите «Result valid»
- Иначе, ничего.
- После вычисления массива, если добавлен новый элемент, необходимо удалить первый элемент, переместить остальные и поместить этот новый элемент в конецмассив.
Я пробовал декларативным и реактивным способом, но реактивный способ не убеждает меня в том, что он действительно реактивный, так как он содержит много if / else и много логики в подписчике.
У меня вопрос такой: в функции упражнение_1__v2_reactive, код соответствует реактивному программированию?
function exercise_1__v1_imperative() {
let values: Array<Date> = [];
values.push(new Date());
document.addEventListener(`click`, () => {
values.push(new Date());
console.log(`values: `, values);
if (values.length === 3) {
let a = values[0].valueOf(), b = values[1].valueOf(), c = values[2].valueOf();
let result = (c - b + a) % 2;
console.log(`result: `, result);
if (result === 0) {
console.log(`Resultado valido: `, result);
}
values.shift();
}
});
}
function exercise_1__v2_reactive() {
const newDate$ = of(new Date().valueOf());
// newDate$.subscribe(console.log);
const clickDate$ = fromEvent(document, `click`).pipe(
map(x => new Date())
);
clickDate$.pipe(
startWith(new Date()),
scan<Date, Array<Date>>((acc, value) => {
if (acc.length === 3) {
acc.shift();
}
acc.push(value);
return acc;
}, [])
).subscribe(values => {
console.log(values);
if (values.length === 3) {
let a = values[0].valueOf(), b = values[1].valueOf(), c = values[2].valueOf();
let result = (c - b + a) % 2;
console.log(`result: `, result);
if (result === 0) {
console.log('Resultado valido: ', result);
}
}
});
}