如何使用Observable的frokJoin和自己的事件

时间:2016-05-06 10:13:51

标签: typescript angular rxjs reactivex

我在angular2应用程序中使用subject of subject来表示事件。

当我做那样的事情时:

let subject1 = new Subject<string>();
let subject2 = new Subject<string>();
subject1.subscribe(data=>console.debug(data));        
subject2.subscribe(data=>console.debug(data));        
subject1.next("this is test event1");
subject2.next("this is test event2");

一切正常,但我想等待两个事件发生,然后做一些动作。我找到了Observable.forkJoin,但我不能让它与Subjects一起工作。像这样的代码不起作用

Observable.forkJoin(
           subject1.asObservable(),
           subject2.asObservable()
        ).subscribe(
            data => {
              console.debug("THIS IS MY FJ");
              console.debug(JSON.stringify(data));
            },
            error=>console.error(error),
            ()=>{
              console.info('THIS IS MY FJ SUCCESS');
            }
        );        

请帮我解决这个问题。

最诚挚的问候 Krzysztof Szewczyk

1 个答案:

答案 0 :(得分:2)

在您的情况下,您需要使用zip运算符。此运算符将合并指定的可观察序列,而forkJoin运算符并行运行所有可观察序列并收集它们的最后元素。

所以forkJoin运算符适用于HTTP observables,但不适用于主题。

以下是一个示例。

export class App {
  subject1: Subject<string> = new Subject();
  subject2: Subject<string> = new Subject();

  constructor() {
    this.subject1.subscribe(data=>console.debug(data));        
    this.subject2.subscribe(data=>console.debug(data));        

    Observable.zip(
      this.subject1,
      this.subject2
    ).subscribe(
      data => {
        console.debug("THIS IS MY FJ");
        console.debug(JSON.stringify(data));
      },
      error=>console.error(error),
      ()=>{
        console.info('THIS IS MY FJ SUCCESS');
      }
  );        
}

test() {
  this.subject1.next("this is test event1");
  this.subject2.next("this is test event2");
}

参见相应的plunkr:https://plnkr.co/edit/X74lViYOgcxzb1AjC9dL?p=preview