识别和精确 RxJS 中的一系列事件
Recognizing and exact series of events in RxJS
使用RxJS,如果用户键入"a"然后"b"然后"c",我想触发一个事件。
如果他们输入"a"然后"b"然后"z"然后"c",我不希望事件被触发。
这是我到目前为止所做的工作的代码笔(在 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();
};
这似乎有效,它使用一个简单的状态机,并且可以泛化以识别任何基本的正则表达式。此处识别的正则表达式是 *abc* :
function noop () {}
var keyUp$ =
Rx.Observable.fromEvent(ta_input, 'keyup')
.map(function(ev){return ev.keyCode});
var stateMachine$ = keyUp$
.scan(function (state, keyCode) {
if (String.fromCharCode(keyCode) === state.password[state.index]) {
state.index++;
if (state.index === state.password.length) {
state.found = true;
}
}
else {
state.index = 0;
state.found = false;
}
return state;
}, {password : 'ABC', index : 0, found: false})
.filter(function (state){return state.found})
.take(1)
stateMachine$.subscribe(noop)
要检查它,请运行 jsffidle,然后在文本区域中键入 abc。出于某种原因,您的密码必须大写,但该部分应该易于修复。检测到abc
子字符串时,stateMachine$
可观察量发出found
并完成。
我相信
你正在寻找bufferWithCount。
查看来自 RxJSNext 的这个规范(在 next中重命名为 bufferCount):
it('should emit full buffer then last partial buffer if source completes', function () {
var e1 = hot('--a^-b--c--d--e--|');
var e1subs = '^ !';
var expected = '--------y-----(z|)';
expectObservable(e1.bufferCount(3)).toBe(expected, {
y: ['b', 'c', 'd'],
z: ['e']
});
expectSubscriptions(e1.subscriptions).toBe(e1subs);
});
相关文章:
- 分派点击事件并保留击键修饰符
- 模糊事件的Javascript测试
- keyup事件处理程序更改焦点不适用于快速键入
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 如何使Javascript动态html表及其上的事件
- 使用类从一个标记中双击事件
- 如何在未直接触发的情况下停止事件
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- 对iPad上的点击事件反应缓慢
- 如何获取在一系列事件中启动事件的元素
- 链接一系列具有中间延迟的javascript事件
- 导致一系列事件 主干事件:名称
- 如何创建一系列鼠标单击事件
- 识别和精确 RxJS 中的一系列事件
- 如何使函数由一系列事件触发
- 如何用一系列文本为onclick事件做准备
- 从一系列onMouseOver事件中创建一个循环
- 如何忽略一系列快速Javascript事件中的最后一个事件之外的所有事件
- 在JavaScript中将一系列DOMNodeInserted事件作为单个事件进行处理
- 如何使用$timeout在Angular中执行一系列事件