【问题标题】:RxJS, Angular: Cannot receive result of subscription in other methodsRxJS,Angular:无法接收其他方法的订阅结果
【发布时间】:2016-07-23 17:29:06
【问题描述】:

我有一个像这样的 Angular 组件:

它创建一个普通的 ReplaySubject。 (见constructor)。 然后其他一些组件通过getSubject() 方法获取subject 并订阅它。另一个组件通过setValue 设置一个新值。该值应由订阅者接收。但是,这不会发生。它什么也没有收到,甚至没有错误。

@Injectable()
export class BreadcrumbService {

    subject: ReplaySubject<string>;

    constructor() {
        this.subject = new ReplaySubject<string>();
        console.log('Step 1: Subject created');
    }

    getSubject(): ReplaySubject<string> {
        console.log('Step 2: Return subject for subscribing');
        return this.subject;
    }

    setValue(title: string) {
        console.log('Step 3: Invoke a new value which should be received in the Subscriber of step 2.');
        this.subject.next(title);
    }
}

如果我将订阅放在 setValue() 中,它会按预期工作。

这是我应该接收订阅的组件:

export class BreadcrumbComponent implements OnInit {

    constructor(
        private breadcrumbsService: BreadcrumbService
    ) {}

    ngOnInit() {
        this.breadcrumbsService.getSubject()
            .subscribe(
                success => {
                    console.log(success); // is never called
                },
                error => {
                    console.log(error); // is never called
                }
            );
    }
}

我的订阅者如何接收此值?

【问题讨论】:

  • 您检查过@Gunter 所说的话吗?除了一切都应该没有任何错误。

标签: angular rxjs observable rxjs5


【解决方案1】:

我没有看到错误,但是 我假设您不止一次提供BreadcrumbService
Angular2 为每个提供者维护一个实例。如果您提供不止一次,则会有多个实例。我假设调用setValue 的实例与BreadcrumbComponent 得到的实例不同。

如果您想要共享实例,请在公共父级(例如根组件)处提供它。

【讨论】:

  • 感谢您的回答!你是绝对正确的。我提供了两次BreadcrumbService
【解决方案2】:

尝试改用Observables

@Injectable()
export class BreadcrumbService {

   subject: Observables<string>;

   constructor() {
       this.subject = new Observables<string>();
       console.log('Step 1: Subject created');
   }

   getSubject(): Observables<string> {
       console.log('Step 2: Return subject for subscribing');
       return this.subject;
   }

   setValue(title: string) {
       console.log('Step 3: Invoke a new value which should be received in the Subscriber of step 2.');
       this.subject.emit(title);
   }
}

【讨论】:

    猜你喜欢
    • 2020-05-23
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    相关资源
    最近更新 更多