2017-11-23 9 views
1

getAllSubModules에 가입하면 forkJoin은 모든 observables를 오류없이 실행하지만 완료되지 않습니다. 나는 forkJoin이 모든 관측 값을 완료 한 후에 만 ​​완료한다는 것을 알고 있지만, 모든 내용이 성공적임을 확인하는 콘솔에서 '-----'3 번을 볼 수 있습니다. RxJS forkJoin이 완료되지 않음

getSubmodules(id): Observable<any> { 
    return this.authService.getToken() 
     .flatMap((token) => this.http.get(`${this.URL}/ROS/applications/modules/${id}/subModules?token=${token}`)) 
     .map((res: any) => res.data.map((subModule) => this.mapSubModules(subModule))); 
    } 
    getAllSubmodules(): Observable<any> { 
    const tasks = []; 
    this.modules.forEach((module: AppModule) => { 
     const obs = this.getSubmodules(module.id).map((subModules) => { 
     this.allSubModules[module.id] = subModules; 
     console.log('--------------------'); 
     }); 
     tasks.push(obs); 
    }); 
    return Observable.forkJoin(...tasks).retry(2); 
    } 
    mapSubModules(moduleData) { 
    if (moduleData.id) { 
     const subModule = <SubModule> { 
     id: moduleData.id, 
     parentId: moduleData.parentId, 
     typeId: moduleData.typeId, 
     name: moduleData.name.az, 
     active: true 
     }; 
     return subModule; 
    } 
    } 

이 코드

forkJoin 사용할 때 실행되지 않습니다 :

this.universityService.getAllSubmodules().subscribe(() => {    
     // --- Below is not executed!-- 
     console.log('subModules in Report Co'); 
     console.log(this.universityService.allSubModules); 
     this.checkUrl(); 
     this.showChild = true; 
     }, (er) => console.log(er)); 

을하지만 대신 forkJoin의 combineLatest를 사용할 때 예상대로 작동합니다. 그래서 문제가 무엇입니까? 누군가 조언을하기를 바랍니다.

+0

리턴 값이없는 맵 호출, 유형 부족, mapSubmodules 메소드의 모호한 정의 (리턴 유형 void 또는 SubModule) 등 많은 문제가 여기에 있습니다. –

답변

3

예상 사항이 잘못되었습니다. console.log('--------------------')이 3 번 나오면 3 개의 onNext 이벤트가 발생했다는 의미입니다. forkJoin은 모든 관찰 대상이 완료되기를 기다립니다.

.do(next=>{},err=>{},complete => console.log('completed'))으로 개별 스트림을 살펴 보거나 .take(1) 및/또는 .timeout(1000)을 사용하여 스트림 완료시기를 명시 적으로 정의하면 어떻게됩니까?

authService..getToken()은 하나의 값을 방출 한 후에 완료합니까?

+0

고마워요. 테이크 (1)를 추가하면 문제가 해결되었습니다. authService.getToken()이 완료되지 않았기 때문입니다. 다음에 발행되었습니다. 당신의 도움에 감사드립니다! –

관련 문제