> For the complete documentation index, see [llms.txt](https://3440217568.gitbook.io/rxswift/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://3440217568.gitbook.io/rxswift/decision_tree/concatmap.md).

# concatMap

**将 `Observable` 的元素转换成其他的 `Observable`，然后将这些 `Observables` 串连起来**

![](/files/-MWlwKTJ9h3ZzXXEVb7f)

**concatMap** 操作符将源 `Observable` 的每一个元素应用一个转换方法，将他们转换成 `Observables`。然后让这些 `Observables` 按顺序的发出元素，当前一个 `Observable` 元素发送完毕后，后一个 `Observable` 才可以开始发出元素。等待前一个 `Observable` 产生完成事件后，才对后一个 `Observable` 进行订阅。

## 演示

```swift
let disposeBag = DisposeBag()

let subject1 = BehaviorSubject(value: "🍎")
let subject2 = BehaviorSubject(value: "🐶")

let variable = Variable(subject1)

variable.asObservable()
        .concatMap { $0 }
        .subscribe { print($0) }
        .disposed(by: disposeBag)

subject1.onNext("🍐")
subject1.onNext("🍊")

variable.value = subject2

subject2.onNext("I would be ignored")
subject2.onNext("🐱")

subject1.onCompleted()

subject2.onNext("🐭")
```

**输出结果：**

```swift
next(🍎)
next(🍐)
next(🍊)
next(🐱)
next(🐭)
```
