我目前正在使用forkJoin
等待Observable
(ing)和pipe
(ping)之前要完成的tap
(s)数组。
我注意到如果数组为空,则不会发出任何内容,甚至无法tap
。我该如何解决这类问题?我应该只检查数组是否为空吗?
myFirstFunction(...) {
const observables = ...
return forkJoin(observables)
}
mySecondFunction(...) {
return myFirstFunction().pipe(tap(() => ...))
}
答案 0 :(得分:2)
这是因为forkJoin
要求所有源可观察对象至少发射一项,而当没有源可观察对象时,则没有任何对象可发射。但是,forkJoin
仍会发送complete
通知,因此您可以使用例如defaultIfEmpty
运算符来确保它始终发出至少一个next
。
forkJoin(observables).pipe(
defaultIfEmpty(null),
).subscribe(...);
答案 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');
});