5

在我的 Angular 应用程序中,我创建了一个 Observable 来为多个组件提供数据更新。当用户单击一个按钮时,Observable 的所有订阅者都应该使用不同的数据集进行更新。下面是代码。

import { Observable } from 'rxjs/Observable';
import { Subscriber } from 'rxjs/Subscriber';

export class MyService {
private data: number[] = [5,6,7,8];

/// The observable given to outside
private observable: Observable<number[]>;

/// Subscribers of the observable which is given to outside
private subscribers: Map<number, Subscriber<number[]>>;
private nextSubscriberId = 0;

constructor() {
    this.subscribers = new Map();
    this.observable = new Observable(subscriber => {
        const id = ++this.nextSubscriberId;
        this.subscribers.set(id, subscriber);

        subscriber.next(data);

        return () => { this.subscribers.delete(id); };
    });

}

}

在按钮单击事件中,我执行以下操作

data = [1,2,3,4]; 
this.subscribers.forEach((subscriber, key) => {
    subscriber.next(data);
    });

我的问题是,这是管理 Observable 订阅者的最佳方式吗?有没有其他方法来处理订阅者而不是我们自己管理它们?

4

1 回答 1

12

您基本上是在尝试创建自己的 Subject 实现。试试这个:

import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';

export class MyService {
  private source = new Subject<number[]>();
  data$ = this.source.asObservable();

  constructor() {}

  next(data: number[]) {
    this.source.next(data);
  }
}

生产者.component.ts

class ProducerComponent {
  constructor(private myService: MyService) {}

  ngOnInit() {
    this.myService.next([1,2,3]);
  }
}

消费者.component.ts

class ConsumerComponent {
  constructor(private myService: MyService) {}

  ngOnInit() {
    this.myService.data$.subscribe(data => // ...)
  }
}

如果你想在你的服务中有一个初始值,替换:

private source = new Subject<number[]>();

private source = new BehaviorSubject<number[]>([1,2,3,4]);,其中[1,2,3,4]是初始值。

于 2018-03-29T17:10:35.063 回答