Angenommen, ich habe folgendes Markup:RxJS - Zähler mit Reset zustandslos machen?
<button id="dec">-</button>
<output id="out">0</output>
<button id="inc">+</button>
<button id="res">RESET</button>
Und die folgende Rx.js Skript:
var total = 0
Rx.Observable.merge(
// decrement
Rx.Observable.fromEvent($('#dec'), 'click')
.map(function() { return -1 }),
// increment
Rx.Observable.fromEvent($('#inc'), 'click')
.map(function() { return +1 }),
// reset
Rx.Observable.fromEvent($('#res'), 'click')
.map(function() { return -total })
) // merge
.forEach(function(delta) {
total += delta
$('#out').text(total)
})
alles wie erwartet funktioniert. Durch Klicken auf das +/- wird der Zähler inkrementiert/dekrementiert, und durch Klicken auf "RESET" wird er auf Null zurückgesetzt, aber ... Ich habe die Variable "total" ganz oben. Das ist ein Zustand, der, wenn ich die Werte der funktionalen reaktiven Programmierung abonniere, böse ist, nein? Wenn ja, wie behebe ich das? Wenn ich die Reset-Taste nicht hätte, könnte ich einfach scan(seed, accumulator)
verwenden, aber die Funktionalität der Reset-Taste wirft mich auf eine Schleife, wie man es "zustandslos" macht.
Ich denke, die erste Option ist am einfachsten zu lesen. Der zweite ist ziemlich clever, danke, dass du dir die Zeit genommen hast zu antworten! – Jrop