angular - 如何使用 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'];})
解决方案
在您的情况下,您可能正在寻找 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/mergeMap
?switchMap
在这种情况下,您可能不需要flatMap
(这只是 的别名mergeMap
) or switchMap
,因为显然这两个函数调用不相关(没有依赖关系)。换句话说,我不明白为什么我们需要等待第一个 observable 发射然后调用第二个 observable。我们可以“并行”执行所有内容。
推荐阅读
- vue.js - Vuejs 如何正确使用 $emit 函数?
- php - 如何使用 AND 或 OR 运算符检查数组中的多个值
- laravel - 如何将数据从 Vue 传递到 Laravel 以获取补丁请求?
- sql - SELECT 语句返回行,但具有相同 WHERE 的 SELECT COUNT(*) 不返回 (AWS AuroraDB)
- amazon-web-services - AWS 中的参数引用
- java - 为 Spring Boot 嵌入式 tomcat 添加战争
- r - 在 R 中,获取 ZIP 存档中每个文件的文本和相应的文件名
- c# - 未找到或调用类库中的 HTTP 处理程序?
- python - 尝试训练我的对象检测模型时如何解决此“用户警告:尝试使用关闭的 FileWriter”错误
- ios - iOS/Swift:如何在 AVPlayerViewController 的播放控件中添加共享按钮?