angular - 是否可以在运行时将 observables 添加到 combineLatest (或类似的)?
问题描述
我有这个用例。当从 Boolean observables 列表中的一个为真时,组件不应该是可见的。这是最简单的部分,为此我的服务有一个isBlocked$
作为 API 的公共可观察对象。
困难的部分是我需要在运行时注册新的 observables,但保留我的isBlocked$
参考,这样我目前的订阅不会中断。
例子:
class MyService {
isBlocked$: Observable<boolean> = ?????
add(observable: Observable<boolean>){
}
}
// my component
...
myService.isBlocked$.subscribe(isBlocked => isBlocked)
// isBlocked = false
myService.add(of(true));
// isBlocked = true
解决方案
有可能做到这一点。
您必须使用更高阶的运算符,例如mergeAll
在您的情况下,它应该类似于以下内容:
class MyService {
observables$: Subject<Observable<any>> = new Subject();
isBlocked$: Observable<boolean> = this.observables$.pipe(mergeAll());
add(observable: Observable<boolean>){
this.observables$.next(observable);
}
}
如果您需要以不同于 的方式处理流的流mergeAll
,您还可以检查以下内容:
-
-
-concatAll
zipAll
switch
编辑:
根据要求,这是一个示例:https ://stackblitz.com/edit/rxjs-svzjk5
(启动应用程序并打开您的控制台)
import { of, Subject, Observable, interval } from 'rxjs';
import { map, mergeAll, tap } from 'rxjs/operators';
const animals$$: Subject<Observable<string>> = new Subject();
const addAnimals = (animals: Observable<string>) => animals$$.next(animals);
const animals$: Observable<string> = animals$$.pipe(
mergeAll()
);
// display the values in the stream
animals$.pipe(
tap(console.log)
).subscribe()
// add some animals
addAnimals(
interval(1000).pipe(map((i) => `Wolf ${i}`))
);
addAnimals(
interval(1500).pipe(map((i) => `Cat ${i}`))
);
addAnimals(
interval(600).pipe(map((i) => `Dog ${i}`))
);
推荐阅读
- vb.net - 使用文件作为 StandardInput 和 StandardOutput 在 VB.Net 中运行 CMD
- c++ - 使用正则表达式从另一个 c++ 文件中提取“标识符”
- sql - 日期时间的 SQL(大于等于)和(小于等于)
- android - R闪亮的移动应用程序:防止PullToRefresh
- php - 通过简单的 html dom 在 html-table 中计算比赛日
- java - 为什么我的代码每次都为 AudioSystem.isLineSupported(info) 返回 false?
- javascript - 如何将计数推入 1D 数组以使其成为 2D
- python - 文件路径位置中的点和空格,在熊猫中导入文件
- java - 创建不带 alter 语句的 h2 备份
- c - C中的目录树