Rxjs中merge和concat区别:
1、相同点:
都是将多个可观察输入对象合并为一个可观测输出对象,通过订阅获取输入客观擦对象的弹出的值;
concat中只要有一个输入可观察对象发生错误,其后面的输入可观察对象无法弹出其值,即订阅终止;merge存在竞争关系,有一个输入可观察对象发生错误,也会 终止订阅。
2、不同点:
merge是并联,同步发生,存在竞争关系;concat是串联,按照输入顺序,第一个可观测对象的值弹出完全后,接着开始弹出第二个可观察对象,依次输出。
3、事实上,concat相当于将并发参数设置为1的merge操作符,即 concat(inputObv1,inputObv2, inputObv3, ....) === merge(inputObv1,inputObv2, inputObv3, ...., 1)
1 const o1 = new Observable(observer => { 2 timer(200).subscribe(() => { 3 observer.next('2s'); 4 observer.error('error 第一个输入可观擦对象报错,后续可观擦对象终止订阅'); 5 observer.complete(); 6 }); 7 }); 8 9 const o2 = new Observable (observer => {10 timer(1000).subscribe(() => {11 observer.next('1s');12 observer.complete();13 });14 });15 16 concat(o1, o2).subscribe({17 next(value) {18 console.log('value: ', value);19 },20 error(reason) {21 console.log('reason:', reason);22 },23 complete() {24 console.log('complete');25 }26 });27 28 merge(o1, o2, 1).subscribe({29 next(value) {30 console.log('value: ', value);31 },32 error(reason) {33 console.log('reason:', reason);34 },35 complete() {36 console.log('complete');37 }38 });39 }