Cod*_*n25 0 observable rxjs typescript angular rxjs6
我嵌套了一些订阅,希望摆脱使用合适的RxJS运算符的麻烦。我已经尝试过concatMap和mergeMap,但不幸的是我无法解决问题。
我有3个彼此依赖的订阅,它们在forEach循环中为当前循环的每个值触发一个新的可观察值。为了更详细地说明这一点,这是我的示例代码:
this.subscriptionOne = this.serviceOne.getStreets().subscribe((streets) => {
streets.forEach((street) => {
this.subscriptionTwo = this.serviceTwo.getMetaData(street.id).subscribe((metaDatas) => {
metaDatas.forEach((md) => {
// do some stuff and then trigger another observable..
this.subscriptionThree = this.serviceTwo.getStuff(md.id, md.type, md.name).subscribe((stuff) => {
// do some other stuff
});
});
});
});
});
Run Code Online (Sandbox Code Playgroud)
如何摆脱RxJ的嵌套?
let sub = this.serviceOne
.getStreets()
.pipe(
mergeMap(streets => {
return from(streets);
}),
mergeMap(street => {
return this.serviceTwo.getMetaData(street.id);
}),
mergeMap(metaDatas => {
return from(metaDatas);
}),
mergeMap(md => {
return this.serviceTwo.getStuff(md.id, md.type, md.name);
}),
map(stuff => {
// do your stuff
})
)
.subscribe();
Run Code Online (Sandbox Code Playgroud)
metaDatas 在最后两个运算符中可用:
let sub = this.serviceOne
.getStreets()
.pipe(
mergeMap(streets => {
return from(streets);
}),
mergeMap(street => {
return this.serviceTwo.getMetaData(street.id);
}),
mergeMap(metaDatas => {
return from(metaDatas).pipe(
mergeMap(md => {
return this.serviceTwo.getStuff(md.id, md.type, md.name);
}),
map(stuff => {
// do your stuff
})
);
})
)
.subscribe();
Run Code Online (Sandbox Code Playgroud)