RxJs-具有空数组的forkJoin

Lpp*_*Edd 2 rxjs

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

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

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

mySecondFunction(...) {
   return myFirstFunction().pipe(tap(() => ...))
}
Run Code Online (Sandbox Code Playgroud)

Phi*_*ohn 9

另外马丁的回答。

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

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');
});
Run Code Online (Sandbox Code Playgroud)


mar*_*tin 5

那是因为forkJoin要求所有源Observable至少发射一项,并且当没有源Observable时什么也没有发射。但是,forkJoin仍然会发送complete通知,因此您可以使用例如defaultIfEmptyoperator来确保它始终发出至少一个next

forkJoin(observables).pipe(
  defaultIfEmpty(null),
).subscribe(...);
Run Code Online (Sandbox Code Playgroud)

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

  • 我问这个问题是因为我正在查看此页面 https://www.learnrxjs.io/operators/combination/forkjoin.html 并没有发现任何提及此内容的内容。哦顺便说一句,必须使用“defaultIfEmpty([])” (2认同)