1

我在我的 angular2 应用程序中使用响应式主题来表示事件。

当我做这样的事情时:

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 但我不能让它与主题一起使用。像这样的代码不起作用

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

4

1 回答 1

2

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

因此,forkJoin操作员可以使用 HTTP 可观察对象,但不能使用主题。

这是一个示例。

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 。

于 2016-05-06T10:30:37.850 回答