Forkjoin与空(或非)可观察数组

时间:2017-07-06 13:28:15

标签: rxjs rxjs5

我试图检测我的所有观察结果何时完成。我有以下Observables:

let observables:any[] = [];
if(valid){
    observables.push(new Observable((observer:any) => {
        async(()=>{
            observer.next();
            observer.complete();
        })
    }))
}
if(confirmed){
    observables.push(new Observable((observer:any) => {
        async(()=>{
            observer.next();
            observer.complete();
        })
    }))
}

Observable.forkJoin(observables).subscribe(
    data => {
        console.log('all completed');
    },
    error => {
        console.log(error);
    }
);

每当我的所有功能都完成时,我都需要做点什么。当observables数组不为空时,Forkjoin似乎有效。但是当数组为空时,它永远不会被调用。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:7)

您缺少订阅中的第三个回调。试试这个:

Rx.Observable.forkJoin([]).subscribe(
    val => {
        console.log('next');
    },
    err => {
        console.log('err');
    },
    () => {
        console.log('complete')
    }
);

空数组上的forkJoin立即完成。

答案 1 :(得分:2)

您缺少complete回调。您可以传递第三个参数或传递observer对象而不是3个参数,以使事件检查更具可读性。

yourObservable.subscribe({
  next: value => console.log(value),
  error: error => console.log(error),
  complete: () => console.log('complete'),
});

答案 2 :(得分:2)

尝试一下:

import { forkJoin, Observable, of } from 'rxjs';

export function forkJoinSafe<T = any>(array: Observable<T>[]): Observable<T[]> {
    if (!array.length) {
        return of([])
    }
    return forkJoin<T>(array);
}