Rxjs 角度5-订阅行为主题时发出
在一个服务的构造函数中订阅行为主题变量时,我遇到了一个问题。当ok的值为0时,订阅第一次发生,但当我执行时。next(1)在服务1中,订阅未在服务2的构造函数中发生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
服务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);
// }
}
}