考虑下面的类的DUMMY示例,它只包含一个主题列表和一个listen方法。
class X {
subjects: Subject<any>[] = [new Subject<any>()];
listen(): Observable<any> {
return merge(...this.subjects).pipe();
}
}
class Y {
constructor() {
new X().listen().subscribe(value => console.log('received', value));
}
}
如果,现在,我们在名单上加一个新的主题。
class X {
...
addSubject(subjectToAdd: Subject<any>): void {
this.subjects.push(subjectToAdd);
}
...
}
如果在主题subjectToAdd
上发出事件,则Y类将从不记录该事件,因为它开始监听旧列表。Y
不应该知道X
的内部状态,它说它想要监听并且应该接收在驻留在X
中的任何主题上执行的任何事件,无论该事件是在订阅时间还是稍后添加的。
注意,这只是一个虚拟的例子,我只是想知道是否有一种方法仍然可以调用listen
方法,该方法可以向现有流添加可观察对象。
2条答案
按热度按时间zmeyuzjn1#
这里有一个愚蠢的想法,虽然它的工作(那么它是 * 真的 * 愚蠢?):创建一个可观测量流并将其展平两次。
https://stackblitz.com/edit/rxjs-q2h9vm?devtoolsheight=60&file=index.ts
ou6hu8tu2#
我做过类似的事情,其中一个方法是使用另一个Subject,即“add”操作,这个add操作可以从现有的Subject列表中创建一个新的列表。
这不是您的确切场景,但您可以根据自己的情况进行调整:
上面我创建了一个Subject,它在创建、更新或删除操作时发出。(听起来好像你只有add?)
然后,它创建了一系列新的产品(你的产品将创建一系列新的主题)。
此外,如果您将
listen
Observable声明为声明性的(而不是方法),那么它将在每次发出操作主题时发出。如果你想在Stackblitz上做一些虚拟的东西,我可以调整我的示例代码,使之更接近你所寻找的。