【发布时间】:2016-01-20 02:11:19
【问题描述】:
使用 RxJS,如果用户键入“a”然后“b”然后“c”,我想触发一个事件。
如果他们输入 'a' 然后 'b' 然后 'z' 然后 'c',我不希望触发事件。
这是我迄今为止所做的工作的codepen(在 TypeScript 中)。
class App1 {
private divStream: HTMLElement;
private divResult: HTMLElement;
constructor(divStream: HTMLElement, divResult: HTMLElement) {
this.divStream = divStream;
this.divResult = divResult;
}
start() {
var filterByCharacter = (expectedCharater) => {
return (char) => { return char === expectedCharater; };
};
var values = ['a', 'b', 'b', 'c', 'b'];
var obChars = Rx.Observable.fromArray(values);
obChars.subscribe((k) => {
divStream.innerHTML += "<div style='color: blue'>" + ":: " + k + " ::" + "</div>";
},
(err) => {
divStream.innerHTML += "<div style='background-color: blue' > " + 'Error: ' + err + " </div>";
},
() => {
divStream.innerHTML += "<div style='background-color: blue'>" + ":: finished ::" + "</div>";
}
);
function log(text: string) {
divResult.innerHTML += "<div style='color: green'>" + text + "</div>";
}
var obA: Rx.Observable<string> = obChars.filter(filterByCharacter('a'));
var obB: Rx.Observable<string> = obChars.filter(filterByCharacter('b'));
var obC: Rx.Observable<string> = obChars.filter(filterByCharacter('c'));
let aSteps: Rx.Observable<any>[] = [];
aSteps.push(obA.take(1).do(() => { log("a"); }).ignoreElements());
aSteps.push(obB.take(1).do(() => { log("b"); }).ignoreElements());
aSteps.push(obC.take(1).do(() => { log("c"); }));
let steps: Rx.Observable<any> = Rx.Observable.concat<any>(aSteps);
var source = steps
.takeUntil(Rx.Observable.timer(100 * values.length));
var subscription = source.subscribe(
function (x) {
log("Next: " + x);
},
function (err) {
divResult.innerHTML += "<div style='background-color: green'>Error: " + err + "</div>";
},
function () {
divResult.innerHTML += "<div style='background-color: green' > " + 'Completed' + "</div>";
});
}
stop() {
clearTimeout(this.timerToken);
}
}
window.onload = () => {
var app = new App1(document.getElementById('divStream'), document.getElementById('divResult'));
app.start();
};
【问题讨论】:
-
仅供参考:我看到了实现此stackoverflow.com/questions/25833495/… 的“减少”方法。我正在寻找更多 RxJS 原生的东西。
-
另一条评论:当我说我正在寻找更多 RxJS 原生的东西时,我的意思是我正在寻找一个声明性的答案,而不是一个命令性的答案。
标签: javascript reactive-programming rxjs