我的路由模块中有一个解析器
{
path: 'path1',
component: FirstComponent,
resolve: {
allOrders: DataResolver
}
}
然后在我的resolve函数中有
resolve(): Observable<Array<string>> {
return this.serviceA.getAllfooNames()
.map(result=> {
/* result is an array of strings*/
return this.serviceB.getAllBarNames(result[0])
/*orders is also supposed to be an array of strings*/
.map(orders=> return orders)
});
}
}
我希望根据 allOrders 键存储值 orders 。 我想传递 orders 数组作为ActivatedRoute快照中的数据。请帮忙。
答案 0 :(得分:1)
您可以混合使用concatMap
和zip
:
resolve(): Observable<Array<string>> {
return this.serviceA.getAllfooNames().pipe(
concatMap((names) =>
zip(...names.map((name) => this.serviceB.getAllBarNames(name)))
),
map((...names) =>
names.reduce((acc, curr) => acc.concat(curr), [])
)
);
}
这将以一大串字符串返回从serviceB调用返回的所有字符串。
基本上它是做什么的,您调用getAllfooNames
,用concatMap
直到此请求完成,该请求以字符串形式返回一堆名称。之后,您可以使用zip
运算符进行选择。该运算符使用数组映射方法执行传递给该对象的所有可观测对象,并在所有可观测对象完成后发出。
然后在映射中将其拾取,该映射接收多个字符串数组作为参数。然后,您使用reduce
将其分成一个大数组。