codecamp

RxJS sequenceEqual

使用可选的比较器函数按顺序比较两个可观察值的所有值,并返回表示两个序列是否相等的单个布尔值的可观察值。

sequenceEqual<T>(compareTo: Observable<T>, comparator?: (a: T, b: T) => boolean): OperatorFunction<T, boolean>

参量

相比于 与源序列进行比较的可观察序列。
比较器 可选的。默认值为undefined。可选功能,用于比较每个值对

returns

OperatorFunction<T, boolean>:一个布尔值的 Observable,它表示两个 Observable 发出的值顺序是否相等。

描述

按顺序检查两个可观察对象发出的所有值是否相等。

顺序相等的大理石图

sequenceEqual 订阅两个可观察对象,并缓冲每个可观察对象的传入值。每当可观察到的任何一个发出一个值时,该值都会被缓冲,并且缓冲区会从下往上移动并进行比较;如果任何值对不匹配,则返回的 observable 将发出 false并完成。如果其中一个可观察物完成,操作员将等待另一个可观察物完成;如果另一个可观察对象在完成之前发出,则返回的可观察对象将发出 false 并完成。如果一个可观测对象永远不会完成或在其他完成之后发出,则返回的可观测对象将永远不会完成。

找出 Konami 代码是否匹配

import { from, fromEvent } from 'rxjs';
import { sequenceEqual, bufferCount, mergeMap, map } from 'rxjs/operators';


const codes = from([
  'ArrowUp',
  'ArrowUp',
  'ArrowDown',
  'ArrowDown',
  'ArrowLeft',
  'ArrowRight',
  'ArrowLeft',
  'ArrowRight',
  'KeyB',
  'KeyA',
  'Enter', // no start key, clearly.
]);


const keys = fromEvent(document, 'keyup').pipe(map(e => e.code));
const matches = keys.pipe(
  bufferCount(11, 1),
  mergeMap(
    last11 => from(last11).pipe(sequenceEqual(codes)),
  ),
);
matches.subscribe(matched => console.log('Successful cheat at Contra? ', matched));

也可以看看

RxJS scan
RxJS share
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

RxJS operators

RxJS fetch

RxJS testing

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }