用Subject或者BehaviorSubject对流实现转接支流!

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,此事件流可自行管理自己的生命周期!不必removeEventListener!结束时直接click.complete()或者使用takeUntil操作符!

const click$: Subject<Event> = new Subject();
const iwe7:Iwe7EventTarget = new Iwe7EventTarget();
iwe7.addEventListener('click',click$);
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值