首页 > 解决方案 > 如何使用 Angular 6 进行多个独立订阅?

问题描述

什么是 flatMap()、switchmap()、pipe()?在以下情况下哪一个最好?一旦收到两个响应,我想调用下一个方法。

this.jobService.getEditableText('admins',compareFile["0"].path,1000).subscribe(data=>{
this.file1=data['data'];})
this.jobService.getEditableText('admins',compareFile["1"].path,1000).subscribe(data=>{
this.file2=data['data'];})

标签: angulartypescript

解决方案


在您的情况下,您可能正在寻找 acombineLatest或 a forkJoin。我们无法确定,因为我们不知道 Function 的代码getEditableText()

我们应该使用什么运算符?

forkJoin如果我们需要等到两个输入 observables完成

combineLatest如果我们想在两个 observables 都发射一次后立即发射(发射不完整!)。

根据您所做的问题,我强烈建议您再次查看 RxJS 管道。主要原因是当您手动订阅 Observables 时,您也应该在不再需要它们时立即取消订阅以避免内存泄漏。根据你的代码,我会做这样的事情:

const subscription = combineLatest([this.jobService.getEditableText('admins',compareFile["0"].path,1000), 
this.jobService.getEditableText('admins',compareFile["2"].path,1000)])
.subscribe(console.log)

现在,只要两个函数都返回结果,您应该会得到一个包含结果数组的控制台日志:[res1, res2]。

请记住,一旦您不再需要激活订阅(例如,当您销毁组件时),您需要取消订阅以避免内存泄漏:

subscription.unsubscribe();

如果您收到一些弃用警告,这可能与您将可观察对象作为参数传递给 combineLatest 运算符的方式有关。combineLatest 根本不被弃用。在最新版本中,您应该传递一组可观察对象,而不仅仅是可观察对象。

例如较旧的 RxJS 版本:

combineLatest(one$, two$)

较新的版本:

combineLatest([one$, two$])

为什么不呢flatMap/mergeMapswitchMap

在这种情况下,您可能不需要flatMap(这只是 的别名mergeMap) or switchMap,因为显然这两个函数调用不相关(没有依赖关系)。换句话说,我不明白为什么我们需要等待第一个 observable 发射然后调用第二个 observable。我们可以“并行”执行所有内容。


推荐阅读