angular - RxJs - 动态地将相互依赖的同步调用添加到没有嵌套的 fork join
问题描述
我试图避免嵌套一些相互依赖的同步调用。当一切都完成后,我还想在最终结果中进行订阅,比如 forkjoin。
我已经找到了如何在 stackoverflow 上执行此操作(在继续主订阅(rxJs)之前等待角度的嵌套订阅),但不是如何动态地执行此操作。
目前我正在使用回调,但是当所有完成/ forkjoin 行为时,这不适用于订阅:
public keys = ['stateId', 'countyId'];
function populate(index, params = null) {
let route = this.baseRoute + this.keys[index];
this.apiCall(route, params).subscribe(response => {
if (index + 1 < keys.length) {
this.populate(index + 1, this.getParamsFromResponse(response));
}
这是上面引用的stackoverflow链接的答案:
getData() { isLoading = true; this.someSevice.getSomeData().pipe( mergeMap(getUserData), mergeMap(getMetadata), ) .subscribe( response => { isLoading = false; }, error => { isLoading = false; this.errors = error; }, ); }
使用上面引用的stackoverflow链接中的答案,我不知道如何
A - 通过循环动态插入mergeMaps,而不是硬编码它们
B - 将适当的参数传递给 mergeMaps(路由和参数)
我会很感激任何帮助。谢谢。
解决方案
是你的意思吗?如果您可以在数组中包含可观察对象,则可以使用reduce
运算符按顺序遍历它们。
ngOnInit() {
const listOfString = ['item1', 'item2', 'item3', 'item4'];
listOfString
.slice(1, listOfString.length) // has to exclude the first item as we already defined it below
.reduce(
(a, b) => a.pipe(mergeMap((aResult) => this.getData(b, aResult))),
this.getData(listOfString[0], null) //first call
)
.subscribe();
}
getData(input: string, params: string): Observable<string> {
const result = `${input} ${params ? params : ''}`;
console.log(result);
return of(result);
}
推荐阅读
- python - Python OpenCV cv2.putText() - 如何用不同的文本标记多个形状?
- spring-boot - 无论如何要在 Oauth2 客户端 api Spring Boot 中配置授权注销 url
- javascript - 如何在 javascript 中使用斜杠 / 在 URL 中传递值
- html - 显示 django admin 而不是我的 html
- c# - 在 .NET5 中使用 System.DirectoryServices.Protocols 获取 LDAP TokenGroups
- javascript - JavaScript 在 Shiny 的模态中不起作用
- javascript - 如何在布局页面中的另一个脚本之前执行脚本文件?
- javascript - Prop 可能是 Vue 3 设置中的未定义错误
- c# - 解析具有超出范围值的枚举时的奇怪行为
- python - 当前路径,accounts/login/",与其中任何一个都不匹配