RxJS - forkJoin何时触发?

时间:2017-05-24 03:44:43

标签: javascript angular rxjs

什么会导致个别subscribe触发,但forkJoin不会触发?

我已发出触发subject.subscribe的请求,但当我将其添加到数组以与forkJoin一起使用时,forkJoin().subscribe无法运行。返回的结果是一个对象。

    let responses$ = [];
    _.map(items, (item) => {
        let subject = new Subject();
        this.apiService.postRequest("/api/my-endpoint", data).subscribe(subject);
        responses$.push(subject);
        subject.subscribe((res) => { console.log("this triggers") });
    });

    Observable.forkJoin(responses$).subscribe((res) => {
        console.log("this does not trigger");
    });

这里是postRequest - 我不确定我做得对,我想把它像承诺一样链接。

public postRequest(url: string, data: any) {
    return this.getToken().flatMap((accessToken: Response) => {
        return this.post(url, data, {'Authorization': 'Bearer ' + accessToken});
        });
}

坦率地说,我只想做一些与承诺相似的$q.all

1 个答案:

答案 0 :(得分:1)

forkJoin将发出一个数组,其中包含传递给它的每个observable的最后一个值。当所有可观察量都已完成时,它会发出数组。

因此传递给它的每个observable都需要发出至少一个值,并且还需要完成。

您订阅加入的observable的原因不会触发的原因很可能是因为observable没有完成。您没有在问题中包含getToken()的实现,但除非该可观察结果完成,否则forkJoin既不会发出值也不会完成。

您可以在first()实施中使用postRequest来确保观察对象完整:

public postRequest(url: string, data: any) {
  return this.getToken()
    .first()
    .flatMap((accessToken: Response) => {
      return this.post(url, data, {'Authorization': 'Bearer ' + accessToken});
    });
}