concatMap
返回一个Observable
,该Observable
发出基于对源Observable
发出的值调用提供的函数,该函数返回所谓的内部Observable
。每个新的内部Observable
和前一个内部Observable
连接在一起。内部的Observable
在无限制的缓冲区中聚集,以等待轮流订阅。
注意:内部Observable
以串行的方式等待前一个Observable
完成再订阅下一个。
应用
有一个图片列表,我们需要图片加载完毕后做一些操作。
首先处理单张图片的方法:
1 | loadImage(src: string): Observable<HTMLImageElement> { |
定义了一个方法,通过返回一个Observable
的方式,当图片加载完成后发出值。
我们有一个图片列表:
1 | imageSrcArr: string [] = [ |
首先我们通过fromArray
操作符,将源数组转化为Observable
源:
1 | fromArray(this.imageSrcArr).subscribe(image => { |
然后加上concatMap
操作符,将源数组的每个值应用loadImage
方法进行转化:
1 | fromArray(this.imageSrcArr).pipe( |
这样,按理来讲,console
里面输出的应该是加载图片后的dom,源数组有几条数据就应该有几个图片。
然而,无论怎么搞,都只出现第一张,这是为啥?
回看我们的图片加载方法,在创建Observable
之后只是发射出值,并没有complete
。这就是问题所在。
映射后的Observable
以串行方式等待订阅,上一个Observable
完成之后才会订阅下一个。所以,我们的loadImage
需要改写一下:
1 | loadImage(src: string): Observable<HTMLImageElement> { |
图片加载完毕后这个内部的Observable
应该要完成,这样才会订阅下一个Observable
。
智商税啊,对这个操作符不是很明确,昨晚多搞了几个小时,😌