RxJs-具有空数组的forkJoin

时间:2018-11-26 09:09:45

标签: rxjs

我目前正在使用forkJoin等待Observable(ing)和pipe(ping)之前要完成的tap(s)数组。

我注意到如果数组为空,则不会发出任何内容,甚至无法tap。我该如何解决这类问题?我应该只检查数组是否为空吗?

myFirstFunction(...) {
   const observables = ...
   return forkJoin(observables)
}

mySecondFunction(...) {
   return myFirstFunction().pipe(tap(() => ...))
}

2 个答案:

答案 0 :(得分:2)

这是因为forkJoin要求所有源可观察对象至少发射一项,而当没有源可观察对象时,则没有任何对象可发射。但是,forkJoin仍会发送complete通知,因此您可以使用例如defaultIfEmpty运算符来确保它始终发出至少一个next

forkJoin(observables).pipe(
  defaultIfEmpty(null),
).subscribe(...);

演示:https://stackblitz.com/edit/rxjs-kkd1qa?file=index.ts

答案 1 :(得分:1)

除了马丁的回答。

我有2个可观察变量返回数组,如果其中一个给我一个空数组,它并没有等待另一个可观察变量完成并立即完成。您可以按以下方式处理此类情况。

const response1: Observable<any[]> = this.service.getResponse(params1).pipe(defaultIfEmpty([]));
const response2: Observable<any[]> = this.service.getResponse(params2).pipe(defaultIfEmpty([]));

Observable.forkJoin(response1, response2).subscribe((response) => {
  console.log(response);
}, () => {
  console.log('handle error here');
}, () => {
  console.log('completed');
});