高阶 Observable
通常你会遇到这种情况,以一种类型的 Observable 为起始,然后你想要将它转变为其它的东西。
示例
let stream$ = Rx.Observable
.of(1,2,3)
.flatMap((val) => {
return Rx.Observable
.of(val)
.ajax({ url : url })
.map((e) => e.response )
})
stream.subscribe((val) => console.log(val))
// { id : 1, name : 'Darth Vader' },
// { id : 2, name : 'Emperor Palpatine' },
// { id : 3, name : 'Luke Skywalker' }
这里我们以值1,2,3为起始,然后想把每个值来引导一次 ajax 请求
--1------2-----3------> --json-- json--json -->
我们没有像下面这样使用 .map()
操作符的理由
let stream$ = Rx.Observable
.of(1,2,3)
.map((val) => {
return Rx.Observable
.of(val)
.ajax({ url : url })
.map((e) => e.response )
})
是它给你的结果不是你想要的,而会是下面这样:
// Observable, Observable, Observable
因为我们创建了一个 observable 列表,即三个不同的流,所以订阅得到是流而不是我们想要的数据。然而 flatMap()
操作符可以把这种叫做 metastream
的流中流变扁平。还有一个有趣的操作符叫做 switchMap()
,通常它用来处理 ajax 。想了解更多,请参见级联调用