# concat
创建一个输出Observable,它从当前Observable之后的每个给定输入Observable中顺序发出所有值。
**方法签名**:
```
// 静态方法
public static concat(input1: ObservableInput, input2: ObservableInput, scheduler: Scheduler): Observable
// 实例方法
public concat(other: ObservableInput, scheduler: Scheduler): Observable
```
**示例**:
```javascript
var timer1 = Rx.Observable.interval(1000).take(2);
var timer2 = Rx.Observable.interval(2000).take(3);
var timer3 = Rx.Observable.interval(500).take(2);
var result = timer1.concat(timer2, timer3);
result.subscribe(x => console.log(x));
```
**结果**:
```
0 1 0 1 2 0 1
```
**分析**:
`concat`操作符功能很简单,很容易理解,只有上一个Observable完成后才会执行后续Observable。
## concatAll
通过按顺序连接内部的可观察值,将高阶Observable转换为一阶Observable。
>[warning] 如果外部Observable比内部Observable数据流以更快的速度发出时,这里可能会涉及到[背压(backpressure)](https://www.kancloud.cn/wujie520303/angular2_note/347371)问题。
>[info] 注意:`concatAll`等效于`mergeAll`,并发参数设置为1。
**方法签名**:
```javascript
public concatAll(): Observable
```
**示例一**
```javascript
const source = Rx.Observable.interval(2000);
const example = source
.map(val => Rx.Observable.of(val + 10))
.concatAll();
example.subscribe(console.log);
```
**结果**:
```
10 11 12 13 14 15 16 17 18 19 20 ...
```
**分析**:
调用`concatAll`后,它会在上一个Observable对象完成订阅后订阅下一个Observable对象。这 里第一次执行得到结果`10`,然后2秒后source发出第二个值`1`,调用`map`后得到`11`,然后重复整个过程,直到外部Observable结束。
**示例二**
```javascript
const a = Rx.Observable.interval(1000).take(5);
const b = Rx.Observable.interval(1000).take(2);
const c = Rx.Observable.interval(1000).take(3);
const source = Rx.Observable.of(a, b, c);
const example = source.concatAll();
example.subscribe(console.log);
```
**结果**:
```
0 1 2 3 4 0 1 0 1 2
```
## ConcatMap
**方法签名**
```javascript
public concatMap(project: function(value: T, ?index: number): ObservableInput, resultSelector: function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any): Observable
```
- 说明
- angular 1.x
- ngModelController
- ngOptions
- ngModelOptions
- lifecycle
- directive
- angular 2
- @angular/forms
- 类
- AbstractControl
- AbstractControlDirective
- AbstractFormGroupDirective
- FormControl
- FormArray
- FormBuilder
- FormGroup
- NgControl
- 接口
- controlValueAccessor
- 指令
- DefaultValueAccessor
- Angular 2 生命周期
- OnInit
- DoCheck
- @angular/router
- 配置
- Routes
- 指令
- RouterOutlet
- RouterLink
- 接口
- ActivatedRoute
- UrlTree
- NavigationExtras
- ActivatedRouteSnapshot
- RouterStateSnapshot
- 类
- UrlSegment
- UrlSegmentGroup
- UrlSerializer
- DefaultUrlSerializer
- Router
- bug记得
- @angular/http
- 类
- Http
- Body
- Response
- ResponseOptions
- Header
- Request
- RequestOptions
- URLSearchParams
- @angular/core
- decorator
- Component-decorator
- animation
- DI
- linker
- TemplateRef
- ElementRef
- EmbeddedViewRef
- ViewRef
- ViewContainerRef
- Query
- ComponentFactory
- ComponentRef
- Renderer
- change_detection
- KeyValueDiffers
- IterableDiffers
- ChangeDetectorRef
- ChangeDetectionStrategy
- Zone
- ngZone
- @angular/common
- 指令
- NgTemplateOutlet
- QueryList
- bootstrap4
- card
- form
- 重点关注博客
- 学习过的文章
- 笔记
- Angular 2 双向绑定
- 将字符串解析成DOM
- rx相关
- operators
- combineLatest
- combineAll
- concat(All, Map, *MapTo)
- 背压(backpressure)
- js事件keycode对应表
- 装饰器
- 有用的代码摘录
- 日期操作
- 数量操作
- 字符操作
- rxjs问题
- 小示例
- h5面试准备
- react
- 开发遇到的问题