高阶 Observable

通常你会遇到这种情况,以一种类型的 Observable 为起始,然后你想要将它转变为其它的东西。

示例

  1. let stream$ = Rx.Observable
  2. .of(1,2,3)
  3. .flatMap((val) => {
  4. return Rx.Observable
  5. .of(val)
  6. .ajax({ url : url })
  7. .map((e) => e.response )
  8. })
  9. stream.subscribe((val) => console.log(val))
  10. // { id : 1, name : 'Darth Vader' },
  11. // { id : 2, name : 'Emperor Palpatine' },
  12. // { id : 3, name : 'Luke Skywalker' }

这里我们以值1,2,3为起始,然后想把每个值来引导一次 ajax 请求

—1———2——-3———> —json— json—json —>

我们没有像下面这样使用 .map() 操作符的理由

  1. let stream$ = Rx.Observable
  2. .of(1,2,3)
  3. .map((val) => {
  4. return Rx.Observable
  5. .of(val)
  6. .ajax({ url : url })
  7. .map((e) => e.response )
  8. })

是它给你的结果不是你想要的,而会是下面这样:

  1. // Observable, Observable, Observable

因为我们创建了一个 observable 列表,即三个不同的流,所以订阅得到是流而不是我们想要的数据。然而 flatMap() 操作符可以把这种叫做 metastream 的流中流变扁平。还有一个有趣的操作符叫做 switchMap(),通常它用来处理 ajax 。想了解更多,请参见级联调用