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 }