我怎样才能在 rxjs 订阅中访问 concatMap 对象
How can i have access to concatMap object in subscribe in rxjs
我将 from() 与管道和 concatMap 一起使用,我想访问 concatMap 中的对象,因为之后我需要它来进行映射。
from(objects)
.pipe(
concatMap(object => // i need to have access to object in subscribe
defer(() =>
this.service.getObjectInfors(object.id)
)
)
)
.subscribe(objectInfos => {
if (objectInfos) {
this.objectsTab.push(
this.mappingObject(
object, // i need object in this mapping
objectInfos
)
);
}
});
可以吗?还有其他方法可以帮助我这样做吗?谢谢
您可以将 map
通过管道传输到 concatMap
内的内部可观察对象,然后发送具有这两个值的对象。
尝试以下方法
from(objects).pipe(
concatMap(object =>
defer(() =>
this.service.getObjectInfors(object.id).pipe(
map(objectInfos => ({
obj: object,
infos: objectInfos
}))
)
)
)
)
.subscribe((data: any) => {
// access `data.obj` and `data.infos` here
if (data.infos) {
this.objectsTab.push(
this.mappingObject(
data.obj,
data.infos
)
);
}
});
如果您想避免将一个数组变成一个流,您可以改为合并一个流数组。
您可以使用 array.map 中的闭包将每个对象映射到其流的结果中。
const infoObjectsCalls = objects.map(object =>
defer(() => this.service.getObjectInfors(object.id)).pipe(
filter(objectInfos => objectInfos != null),
map(objectInfos => ({
object,
objectInfos
}))
)
);
merge(...infoObjectsCalls).subscribe(mappingObject =>
this.objectsTab.push(
this.mappingObject(mappingObject)
)
);
我将 from() 与管道和 concatMap 一起使用,我想访问 concatMap 中的对象,因为之后我需要它来进行映射。
from(objects)
.pipe(
concatMap(object => // i need to have access to object in subscribe
defer(() =>
this.service.getObjectInfors(object.id)
)
)
)
.subscribe(objectInfos => {
if (objectInfos) {
this.objectsTab.push(
this.mappingObject(
object, // i need object in this mapping
objectInfos
)
);
}
});
可以吗?还有其他方法可以帮助我这样做吗?谢谢
您可以将 map
通过管道传输到 concatMap
内的内部可观察对象,然后发送具有这两个值的对象。
尝试以下方法
from(objects).pipe(
concatMap(object =>
defer(() =>
this.service.getObjectInfors(object.id).pipe(
map(objectInfos => ({
obj: object,
infos: objectInfos
}))
)
)
)
)
.subscribe((data: any) => {
// access `data.obj` and `data.infos` here
if (data.infos) {
this.objectsTab.push(
this.mappingObject(
data.obj,
data.infos
)
);
}
});
如果您想避免将一个数组变成一个流,您可以改为合并一个流数组。
您可以使用 array.map 中的闭包将每个对象映射到其流的结果中。
const infoObjectsCalls = objects.map(object =>
defer(() => this.service.getObjectInfors(object.id)).pipe(
filter(objectInfos => objectInfos != null),
map(objectInfos => ({
object,
objectInfos
}))
)
);
merge(...infoObjectsCalls).subscribe(mappingObject =>
this.objectsTab.push(
this.mappingObject(mappingObject)
)
);