[英]Map sequence in Rx.JS
我想使用Rx.js映射正确的序列。 最简单的例子是使用键盘。 我将Rx.js附加到键盘事件并等待三个A,无论它们之间是什么,除了Q.当序列匹配时,我想在控制台上打印OK。 例如:
我应该使用过滤功能并保持状态吗? 或者有一种更为有效的方法。
您应该能够使用filter
和scan
操作符来执行您想要的操作:
Rx.Observable.from("AsssAqweAbAAQAAA") // Only A and Q characters are important: .filter(char => (char === "A") || (char === "Q")) // Accumulate the A characters until there are three // or until a Q is received: .scan((acc, char) => { if ((char === "Q") || (acc.length === 3)) { acc = []; } if (char === "A") { acc.push(char); } return acc; }, []) // Filter the accumulated characters until there // are three: .filter(acc => acc.length === 3) .mapTo("OK") .subscribe(value => console.log(value));
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>
您可以尝试使用bufferCount
- 虽然我不确定您的示例是否已经简化,实际上有点复杂,但这可能会有所帮助:
const source$ = Rx.Observable.from("aaqassaaassaaa"); source$.bufferCount(3, 1) // .do(console.log) // uncomment to see the processed data .filter(data => data.join("") === "aaa") // your detection-logic .mapTo("Ok") .subscribe(console.log);
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.