- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想知道使用 RxJS 库执行 3 个取决于先前结果的 http 请求的最佳方法是什么。
假设我的 Angular 应用程序中有 3 个服务,每个服务都有一个函数 get(id: number) 用于订阅请求实体的可观察对象。
我需要对第一个服务进行调用排序,以获取一个实体,该实体包含使用第二个服务进行下一次调用所需的标识符,该实体还包含使用第三个服务进行下一次调用所需的标识符。
const firstEntityId = 1;
this.firstService.get(firstEntityId)
.subscribe((firstEntity: FirstEntity) => {
this.firstEntity = firstEntity;
this.secondService.get(firstEntity.secondEntityId)
.subscribe((secondEntity: SecondEntity) => {
this.secondEntity = secondEntity;
this.thirdService.get(secondEntity.thirdEntityId)
.subscribe((thirdEntity: ThirdEntity) => {
this.thirdEntity = thirdEntity;
});
});
});
const firstEntityId = 1;
this.getFirstSecondThird(firstEntityId)
.subscribe(([firstEntity, secondEntity, thirdEntity]: [FirstEntity, SecondEntity, ThirdEntity]) => {
this.firstEntity = firstEntity;
this.secondEntity = secondEntity;
this.thirdEntity = thirdEntity;
});
getFirstSecondThird(id: number): Observable<[FirstEntity, SecondEntity, ThirdEntity]> {
return this.firstService.get(id).pipe(
switchMap((firstEntity: FirstEntity) => forkJoin(
of(firstEntity),
this.secondService.get(firstEntity.secondEntityId)
)),
switchMap(([firstEntity, secondEntity]: [FirstEntity, SecondEntity]) => forkJoin(
of(firstEntity),
of(secondEntity),
this.thirdService.get(secondEntity.thirdEntityId)
))
);
}
在这种情况下,使用流的方法是否最快?
是否有其他方法来编写我的函数 getFirstSecondThird 而不是使用 switchMap 和 forkJoin 方法?
(我看过 combineLatest 但我没有找到如何从之前的结果中传递一个参数)
最佳答案
也许在方法 1 中使用 map
而不是 subscribe
?
请注意,您需要在所有嵌套级别返回。在示例中,我删除了括号,因此隐含返回。
getFirstSecondThird(id: number): Observable<[FirstEntity, SecondEntity, ThirdEntity]> {
return this.firstService.get(id).pipe(
mergeMap((first: FirstEntity) =>
this.secondService.get(first.secondEntityId).pipe(
mergeMap((second: SecondEntity) =>
this.thirdService.get(second.thirdEntityId).pipe(
map((third: ThirdEntity) => [first, second, third])
)
)
)
)
)
}
这是一个测试片段,
console.clear()
const { interval, of, fromEvent } = rxjs;
const { expand, take, map, mergeMap, tap, throttleTime } = rxjs.operators;
const firstService = (id) => of(1)
const secondService = (id) => of(2)
const thirdService = (id) => of(3)
const getFirstSecondThird = (id) => {
return firstService(id).pipe(
mergeMap(first =>
secondService(first.secondEntityId).pipe(
mergeMap(second =>
thirdService(second.thirdEntityId).pipe(
map(third => [first, second, third])
)
)
)
)
)
}
getFirstSecondThird(0)
.subscribe(result => console.log('result', result))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.3.3/rxjs.umd.js"></script>
如果 getFirstSecondThird()
有可能被第二次调用,您可以使用 switchMap()
而不是 mergeMap()
但是在第一次调用的所有提取完成之前,并且您想放弃第一次调用 - 例如在增量搜索场景中。
关于根据先前的结果订阅多个 http 请求的 Angular RxJS 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53584118/
我的应用将 SceneKit 内容的“页面”与图像和文本交替。当我从图像页面前进到新的 SceneKit 页面时,前一个 SceneKit 页面中的内容会短暂显示,然后被新内容替换。时髦。 我只使用一
我正在尝试处理(在 C# 中)包含一些数字数据的大型数据文件。给定一个整数数组,如何对其进行拆分/分组,以便如果下一个 n(两个或更多)是负数,则前一个 n 元素被分组。例如,在下面的数组中,应该使用
刚接触promises,研究过。所以我的代码和我的理解: sql.connect(config).then(function(connection) { return connection.req
目前我在 if (roobaf) block 中有一些代码,这取决于 foo 和 bar 是否为假。我可以在 block 内再次检查这些条件,但感觉像是不必要的代码重复。 if (foo) {
我是一名优秀的程序员,十分优秀!