merge和concat区别
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<string>(observer => { 2 timer(200).subscribe(() => { 3 observer.next('2s'); 4 observer.error('error 第一个输入可观擦对象报错,后续可观擦对象终止订阅'); 5 observer.complete(); 6 }); 7 }); 8 9 const o2 = new Observable<string>(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 }