Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 每个可观察对象运行一次操作';s值发射_Javascript_Typescript_Rxjs_Reactive Programming_Reactivex - Fatal编程技术网

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();