Angular 哪个rxjs操作符在映射后进行额外转换?
在下面的示例中,第二个Angular 哪个rxjs操作符在映射后进行额外转换?,angular,rxjs,Angular,Rxjs,在下面的示例中,第二个map调用在transformation1示例之后无法访问对象 我需要使用哪个操作符进行嵌套转换(转换2超过转换1)?试试这个 this.service.retrieveObject(id).map((object)=>{ return transformation1(object); }) .map((object)=>{ return transformation2(object); });
map
调用在transformation1
示例之后无法访问对象
我需要使用哪个操作符进行嵌套转换(转换2超过转换1)?试试这个
this.service.retrieveObject(id).map((object)=>{ return transformation1(object); })
.map((object)=>{ return transformation2(object); });
map
是进行转换的正确操作符map
本质上是一个a->b
函数,您可以在其中输入a
并输出b
。对map
的任何后续调用都将获得输出对象
两次调用map
的缺点是,您实际上在对象上迭代了两次。而在小对象上,这可能不是什么大问题,但如果使用大列表,则性能会下降。您可以有效地将transformation1
和transformation2
函数组合成一个函数,并且只需调用map
一次。或者使transformation2
从transformation1
获取返回对象。将两个操作合并到一个调用中会更有效
this.service.retrieveObject(id).map((object)=>{ return transformation1(object); })
.flatMap((object)=>{ return transformation2(object); });
2018年1月17日更新
如果transformation1和transformation2是异步的,那么使用
开关映射如何switchMap
从第一个可观察对象获取结果,并将其传递给第二个可观察对象
this.service.retrieveObject(id)
.map(object => transformation2(transformation1(object)));
第二个map()
接收调用第一个map()
的结果。或者您希望第二个map()
与原始对象一起工作?那么第一个map()
用于什么?transformation1和/或transformation2是否返回可观察值?在我的情况下,这是不可能的,因为transformation1和transformation2是属于两个不同函数的两个函数services@user2080105如果它们是异步的,这就可以解释为什么它们以不同的顺序发射。默认映射行为是嵌套行为。确切地说,transformation1和transformation2是异步的,我找不到方法告诉transformation2等待transformation1如果transformation1和transformation2是异步的,那么使用switchMap呢?transformation1和transformation2是异步的,我找不到方法告诉transformation 2等待transformation 1-然后请发布transformation1
的代码,它的返回值应该是可观察的或承诺,在这种情况下,将其包装在mergeMap
中,而不是map
。
this.service.retrieveObject(id)
.switchMap(retrieveObjectResponse => transformation1(retrieveObjectResponse))
.switchMap(transformation1Response => transformation2(transformation1Response));