Angular 角度5+RxJS订阅主题不工作

Angular 角度5+RxJS订阅主题不工作,angular,rxjs,Angular,Rxjs,我有一个服务,它有一个可观察的订阅。有效负载被传递到服务中的主体上。然而,当我订阅组件中的主题时,什么都没有发生。我应该在组件中的ngOnInit中的.subscribe方法中看到console.log 我在以前的版本中使用了相同的设置,该版本订阅了一个由http.get操作产生的可观察对象。我想知道为什么它不能与这个版本一起工作 服务: @Injectable() export class TileService { availableTiles$ = new Subject<an

我有一个服务,它有一个可观察的订阅。有效负载被传递到服务中的主体上。然而,当我订阅组件中的主题时,什么都没有发生。我应该在组件中的ngOnInit中的.subscribe方法中看到console.log

我在以前的版本中使用了相同的设置,该版本订阅了一个由http.get操作产生的可观察对象。我想知道为什么它不能与这个版本一起工作

服务:

@Injectable()
export class TileService {

  availableTiles$ = new Subject<any>();

  // The view is expecing an array, else: Error trying to diff '[object Object]'. Only arrays and iterables are allowed
  source: {}[] = [
    {title: 'Title A'},
    {title: 'Title B'}
  ];

  simpleObservable = new Observable((observer) => {
    observer.next(this.source);
    observer.complete();
});

  constructor() { }

  getTiles(): void {
    this.simpleObservable.subscribe(x => this.availableTilesStream(x));
  }

  availableTilesStream(data) {
    console.log(data);                // Logs an array of the two objects from the source array
    this.availableTiles$.next(data);  // Nothing seems to happen here.
   }

}

正如Ringo所说,组件最有可能在数据通过.availableTiles$Subject传递后订阅

由于您正在使用Subject,迟到的订阅者将在源Subject上再次调用.next之前不会收到值

一种解决方案是使用BehaviorSubject。这意味着任何订户(包括迟到的订户)都将立即收到一个值

@Injectable()
export class TileService {

   availableTiles$ = new BehaviorSubject<any>([]); // must be initialised with a value

正如Ringo所说,组件最有可能在数据通过.availableTiles$Subject传递后订阅

由于您正在使用Subject,迟到的订阅者将在源Subject上再次调用.next之前不会收到值

一种解决方案是使用BehaviorSubject。这意味着任何订户(包括迟到的订户)都将立即收到一个值

@Injectable()
export class TileService {

   availableTiles$ = new BehaviorSubject<any>([]); // must be initialised with a value

订阅主题之前是否可能发生重复发射?除非您使用的是behaviorsubject,否则任何新订户都不会收到发射。在您订阅该主题之前,是否可能会发生发射的重复?除非您使用的是behaviorsubject,否则任何新订户都不会收到emit。谢谢@Ringo和@Rich。这很有效。让我吃惊的是,在我的http.get版本中,我使用了subject,我创建了observable,并在一行上订阅了所有内容,所以在我看来,observable是填充的,然后订阅的。然而,情况可能并非如此,因为即使http.get所针对的json文件是本地的,订阅实际上是在填充可观察对象之前发生的:this.http.getthis.tilesUrl.subscribetiles=>{this.AvailableLessStreamTiles;订阅发生在任何值发出之前。请记住,Observable在订阅之前不会执行-这很重要。因此,如果您删除该订阅,您将不会在您的开发工具中看到http请求触发。谢谢@Ringo和@Rich。这很有效。让我失望的是,在我的http.get中我使用的是subject版本,我创建了observable,并在一行上订阅了所有内容,所以在我看来,observable是先填充然后再订阅的。然而,情况可能不是这样,因为即使http.get所针对的json文件是本地的,订阅实际上是在填充observable之前发生的:this.http.getthis.tilesUrl.subscribetiles=>{this.availableTilesStreamtiles;订阅发生在发出任何值之前。请记住,在订阅之前不会执行可观察对象-这很重要。因此,如果删除该订阅,您将不会在开发工具中看到http请求触发。