tap操作符
export declare function tap<T>(next?: (x: T) => void, error?: (e: any) => void, complete?: () => void): MonoTypeOperatorFunction<T>;
export declare function tap<T>(observer: PartialObserver<T>): MonoTypeOperatorFunction<T>;
复制代码
tab可以接受一个PartialObserver
/** OBSERVER INTERFACES */
export interface NextObserver<T> {
closed?: boolean;
next: (value: T) => void;
error?: (err: any) => void;
complete?: () => void;
}
export interface ErrorObserver<T> {
closed?: boolean;
next?: (value: T) => void;
error: (err: any) => void;
complete?: () => void;
}
export interface CompletionObserver<T> {
closed?: boolean;
next?: (value: T) => void;
error?: (err: any) => void;
complete: () => void;
}
export interface Observer<T> {
closed?: boolean;
next: (value: T) => void;
error: (err: any) => void;
complete: () => void;
}
export declare type PartialObserver<T> = NextObserver<T> | ErrorObserver<T> | CompletionObserver<T>;
复制代码
可以看出,tab操作符可以Observer作为参数.
class Subject<T> extends Observable<T>;
BehaviorSubject<T> extends Subject<T>;
复制代码
而Subject和BehaviorSubject均为Observable,所以可以直接作为参数使用!从而达到转接的目的。 并且!当原流next,error,complete时都能实时反馈,还可以自己next,error,complete一些东西!而不影响原来的流的运行,简单使用,应用场景很多!
demo
const sub: Subject<number> = new Subject();
interval(1000).pipe(
tap(sub)
).subscribe();
sub.subscribe(res => console.log(res));
复制代码
真实场景
export type Iwe7EventListener = Subject<Event>| BehaviorSubject < Event >;
export class Iwe7EventTarget extends Subject<Event> {
private eventMap: Map<string, Observable<any>[]> = new Map();
/**
*
* @param type 事件类型 string
* @param observable
*/
private addEventListenerToMap(type: string, observable: Observable<any>) {
let observables = this.eventMap.get(type);
observables = observables || [];
observables.push(observable);
this.eventMap.set(type, observables);
}
/**
* 获取所有注册的事件
*/
getListeners() { }
/**
* 添加事件
* @param type string
* @param listener Subject<Event> | BehaviorSubject<Event>
*/
addEventListener(type: string, listener: Iwe7EventListener): void {
let insertListener = this.pipe(
filter((res: Event) => res.type === type),
// 嫁接在这里
tap(listener)
);
this.addEventListenerToMap(type, insertListener);
}
}
复制代码
应用
用支流监听某HtmlELement点击事件流click.complete()或者使用takeUntil操作符!
const click$: Subject<Event> = new Subject();
const iwe7:Iwe7EventTarget = new Iwe7EventTarget();
iwe7.addEventListener('click',click$);
复制代码