Javascript 每个可观察对象运行一次操作';s值发射
假设我们有以下代码():Javascript 每个可观察对象运行一次操作';s值发射,javascript,typescript,rxjs,reactive-programming,reactivex,Javascript,Typescript,Rxjs,Reactive Programming,Reactivex,假设我们有以下代码(): 公共计数器:编号=0;//一些任意的全局状态 public ngOnInit():void{ const subc:Subject=新主题(); const obs:Observable=subc.asObservable().pipe( 点击(():无效=>{ ++这个柜台; })); //此.counter为每个订阅递增。 //但应该每obs新值发射增加一次。 obs.subscribe(); obs.subscribe(); obs.subscribe(); su
公共计数器:编号=0;//一些任意的全局状态
public ngOnInit():void{
const subc:Subject=新主题();
const obs:Observable=subc.asObservable().pipe(
点击(():无效=>{
++这个柜台;
}));
//此.counter为每个订阅递增。
//但应该每obs新值发射增加一次。
obs.subscribe();
obs.subscribe();
obs.subscribe();
sub.next(1);
//现在这个。计数器===3
}
结果是,this.counter
等于3
在执行上述操作后,它已在每个订阅中递增一次
但是,我们如何才能以一种被动的方式,在每个可观察的新值发射中增加一次呢
我知道我们应该避免反应流之外的状态,但在现实世界的应用程序中仍然需要时不时地使用它。请尝试类似的方法一次。我哪儿都跑不动。如果出现错误,请告诉我
public counter: number = 0;
public items: any = [];
public ngOnInit(): void {
const obs: Observable<number> = of(1).pipe(
tap((value): void => {
if(! Array.prototype.includes(value)) {
this.items.push(value);
++this.counter;
}
}));
// this.counter increments for each subscription.
// How to make it increment once per obs new value emission.
obs.subscribe(1);
obs.subscribe(2);
obs.subscribe(1);
// Now this.counter === 3
}
公共计数器:编号=0;
公共项目:任何=[];
public ngOnInit():void{
const obs:Observable=of(1).管道(
点击((值):无效=>{
如果(!Array.prototype.includes(value)){
此.items.push(值);
++这个柜台;
}
}));
//此.counter为每个订阅递增。
//如何使其每obs新值发射增加一次。
obs.subscribe(1);
obs.subscribe(2);
obs.subscribe(1);
//现在这个。计数器===3
}
请尝试一下这样的方法。我哪儿都跑不动。如果出现错误,请告诉我
public counter: number = 0;
public items: any = [];
public ngOnInit(): void {
const obs: Observable<number> = of(1).pipe(
tap((value): void => {
if(! Array.prototype.includes(value)) {
this.items.push(value);
++this.counter;
}
}));
// this.counter increments for each subscription.
// How to make it increment once per obs new value emission.
obs.subscribe(1);
obs.subscribe(2);
obs.subscribe(1);
// Now this.counter === 3
}
公共计数器:编号=0;
公共项目:任何=[];
public ngOnInit():void{
const obs:Observable=of(1).管道(
点击((值):无效=>{
如果(!Array.prototype.includes(value)){
此.items.push(值);
++这个柜台;
}
}));
//此.counter为每个订阅递增。
//如何使其每obs新值发射增加一次。
obs.subscribe(1);
obs.subscribe(2);
obs.subscribe(1);
//现在这个。计数器===3
}
您看到数字3
的原因有点不同。当您使用(1)的时
会发出一个下一个
通知,然后完成
通知。每次调用obs.subscribe()
时,它都会这样做
因此,如果您想查看1
,您需要创建一个中间主题,其中您进行了所有订阅,然后该中间主题订阅了可观察的源(使用publish()
操作符最容易为您创建主题):
const obs:ConnectableObservable=of(1).管道(
点击(():无效=>{
++这个柜台;
}),
publish(),
)作为可连接的,可观察的;
obs.subscribe();
obs.subscribe();
obs.subscribe();
obs.connect();
您的最新演示:
请注意(1)中的无论如何都会发出complete
通知,这意味着publish()中的主题也会完成。这可能(也可能不是)对您来说是个问题,但这实际上取决于您的用例
编辑:这是更新的演示,其中源代码是主题:您看到数字3
的原因有点不同。当您使用(1)的时
会发出一个下一个
通知,然后完成
通知。每次调用obs.subscribe()
时,它都会这样做
因此,如果您想查看1
,您需要创建一个中间主题,其中您进行了所有订阅,然后该中间主题订阅了可观察的源(使用publish()
操作符最容易为您创建主题):
const obs:ConnectableObservable=of(1).管道(
点击(():无效=>{
++这个柜台;
}),
publish(),
)作为可连接的,可观察的;
obs.subscribe();
obs.subscribe();
obs.subscribe();
obs.connect();
您的最新演示:
请注意(1)
中的无论如何都会发出complete
通知,这意味着publish()中的主题也会完成。这可能(也可能不是)对您来说是个问题,但这实际上取决于您的用例
编辑:这是更新的演示,其中源代码是主题:observer.next(++计数器)代码>@atterson:你能更新我的版本来演示吗?我对RxJS不是很有经验,也不知道如何实现您的建议。observer.next(++counter)代码>@atterson:你能更新我的版本来演示吗?我对RxJS不是很有经验,也不知道如何实施你的建议。谢谢你的回答。这假设This.counter
应该保持发出的许多唯一项是可观察的
。然而,这个问题在这方面是通用的,这意味着我们不应该对全局状态属性进行假设。我更新了我的问题,以便更清楚地了解这一点。谢谢你的回答。这假设This.counter
应该保持发出的许多唯一项是可观察的
。然而,这个问题在这方面是通用的,这意味着我们不应该对全局状态属性进行假设。我更新了我的问题,以便更清楚地了解这一点。谢谢!我为我在RxJS领域缺乏知识以及由此引起的混乱道歉。我使用了(1)
中的,这只是一些任意可观察的的最简单例子(在我看来)。然而,由于您的澄清,我看到它执行一些特定的属性。我已经用主题更新了我的问题和演示,结果仍然是这个。计数器等于3
。请看它是否对我的问题有不同的概括。如果你的可观察的来源实际上是主体,那么它就是夏娃
const obs: ConnectableObservable<number> = of(1).pipe(
tap((): void => {
++this.counter;
}),
publish(),
) as ConnectableObservable<number>;
obs.subscribe();
obs.subscribe();
obs.subscribe();
obs.connect();