Rxjs 角度5-订阅行为主题时发出

Rxjs 角度5-订阅行为主题时发出,rxjs,angular5,observable,behaviorsubject,Rxjs,Angular5,Observable,Behaviorsubject,在一个服务的构造函数中订阅行为主题变量时,我遇到了一个问题。当ok的值为0时,订阅第一次发生,但当我执行时。next(1)在服务1中,订阅未在服务2的构造函数中发生 服务1:行为主体变量发出的位置 counter: number = -1; ok: BehaviorSubject<any> = new BehaviorSubject(0); if (this.counter === 0) { setTimeout(() => { this.c

在一个服务的构造函数中订阅行为主题变量时,我遇到了一个问题。当ok的值为0时,订阅第一次发生,但当我执行时。next(1)服务1中,订阅未在服务2的构造函数中发生

服务1:行为主体变量发出的位置

 counter: number = -1;
 ok: BehaviorSubject<any> = new BehaviorSubject(0);
  if (this.counter === 0) {
      setTimeout(() => {
        this.checkCounterFinally();
      }, 1000);
    }
  }

  checkCounterFinally() {
    if (this.counter === 0) {
      this.ok.next(1);

    }

  }

使用BehaviorSubject看起来不错。问题的根源可能是应用程序中有许多Service1实例。

您需要从组件调用下一个方法,如下所示

constructor(private service: Service) {
     this.service.checkCounterFinally(); 
   }
像这样改变服务

import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Injectable } from '@angular/core';

@Injectable()
export class Service {
   counter: number = -1;
    ok: BehaviorSubject<number> = new BehaviorSubject(0);
    selectedSubjectObsv = this.ok.asObservable();

     constructor() { 
if (this.counter === 0) { 
      setTimeout(() => {
        this.checkCounterFinally();
      }, 1000);
    } 
  }


     checkCounterFinally() {
   // if (this.counter === 0) {
      this.ok.next(1);

   // }

  }
}
从'rxjs/BehaviorSubject'导入{BehaviorSubject};
从“@angular/core”导入{Injectable};
@可注射()
出口类服务{
计数器:数字=-1;
确定:行为主体=新的行为主体(0);
selectedSubjectObsv=this.ok.asObservable();
构造函数(){
如果(this.counter==0){
设置超时(()=>{
这是一个反例();
}, 1000);
} 
}
核对{
//if(this.counter==0){
这个。好。下一个(1);
// }
}
}

在此处找到工作代码

您能用此代码创建一个可能代码最少的打捞器吗?我认为主要的问题是您直接使用主题,而不是返回可观察对象(通过
asObservable()
),但这很难确定。您好,谢谢您的回复。但不幸的是,根据要求,我不必使用相同的组件。它是仅使用行为主体的服务之间的通信。任何建议。我使用了单个组件,仅用于演示目的。仍然可以使用多个组件。查看stackblitz中的更新代码。嗨,穆罕默德,谢谢你的回复。对于某些功能,我也是这样做的。那边的工作很好。此外,我这里只有服务1的实例。
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Injectable } from '@angular/core';

@Injectable()
export class Service {
   counter: number = -1;
    ok: BehaviorSubject<number> = new BehaviorSubject(0);
    selectedSubjectObsv = this.ok.asObservable();

     constructor() { 
if (this.counter === 0) { 
      setTimeout(() => {
        this.checkCounterFinally();
      }, 1000);
    } 
  }


     checkCounterFinally() {
   // if (this.counter === 0) {
      this.ok.next(1);

   // }

  }
}