RxJS-Observable Operators - switch, mergeAll, concatAll

concatAll

它会处理完前一个observable 才会在处理下一个observable

如果送出observable是无限的永远不会完成(complete),就导致他永远不会处理之后送出的observable

const body = document.body;
const click = fromEvent(body, 'click')
    .pipe(
        map(e => interval(500).pipe(take(3)),    //  每500ms送出值,输出三次
        concatAll()
    );

click.subscribe(d => console.log(d));
/**
 * 点击后
 * 0
 * 1
 * 2
 * 3
 */

mergeAll

并行处理多个observable

另外mergeAll 可以传入一个数值,这个数值代表他可以同时处理的observable 数量

如果传入1,则效果和concatAll完全相同

const body = document.body;
const click = fromEvent(body, 'click')
    .pipe(
        map(e => interval(500).pipe(take(3)),    //  每500ms送出值,输出三次
        mergeAll(2)	//	并发2
    );

click.subscribe(d => console.log(d));
/**
 * 点击后
 * 0
 * 0
 * 1
 * 1
 * 2
 * 2
 */

switchAll

在新的observable送出后直接处理新的observable不管前一个observable是否完成,每当有新的observable送出就会直接把旧的observable退订(unsubscribe),永远只处理最新的observable

const body = document.body;
const click = fromEvent(body, 'click')
    .pipe(
        map(e => interval(500).pipe(take(3)),    //  每500ms送出值,输出三次
        switchAll()
    );

click.subscribe(d => console.log(d));
/**
 * 点击后
 * 0
 * 1
 * 2
 */

附完整Deme Code:

const body = document.body;
const click = fromEvent(body, 'click')
    .pipe(
        map(e => interval(500).pipe(take(3))),    //  每500ms送出值,送3次停止
        concatAll(),     //  快速点击body,会按顺序输出三次0,1,2
        // switchAll(),     //  快速点击body,只输出一次0,1,2
        // mergeAll()          //   快速点击,会重复的输出多次0,1等。点击越多下,最后送出的频率就会越快。不会舍去,每次都会输出
    );

click.subscribe(d => console.log(d));