2017-04-19 1 views
1

두 개의 (여러 개의) 비동기 함수가 Observable으로 묶여 있고 모두 함께 실행하고 오류가 있거나 완료 될 때마다 확인하고 싶습니다. 여기에 내가 할 것입니다 :RXjs - 오류가 있더라도 계속 듣기

var observables = []; 

observables.push(new Observable((observer:any) => { 
    async1(options, (error, info) => { 
     if (error) { 
      observer.error(error); 
     } else { 
      observer.next(info); 
      observer.complete(); 
     } 
    }); 
})) 

observables.push(new Observable((observer:any) => { 
    async2(options, (error, info) => { 
     if (error) { 
      observer.error(error); 
     } else { 
      observer.next(info); 
      observer.complete(); 
     } 
    }); 
})) 

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

을 지금 여기 내 문제는 ... 비동기 기능을 모두 완료가 성공적으로, 그것은 data =>{}를 호출하고 배열에 모두 결과를 반환합니다.

두 함수 중 하나가 실패하면 error =>{}을 한 번 호출하면됩니다. 모든 오류를 듣고 싶습니다. 어떻게 할 수 있습니까?

+0

하나의 방법이 오류가 발생하지만, 오류 코드, 라 Node.js를'{결과를 통과하지 않는 것입니다, err}' – user3743222

답변

1

여러 스트림을 결합하는 연산자의 기본 동작은 스트림 중 하나에서 오류 알림을 내보내는 즉시 종료하는 것입니다. 이는 Rx 문법에 따라 오류가 최종적이기 때문에 일반적으로 운영자가 반환 한 스트림이 열정적으로 실패해야한다고 가정합니다.

여기서 쉬운 해결책 중 하나는 error 알림을 제거하고이를 next 알림에 삽입 된 오류 데이터 구조로 바꿉니다.

그래서 같은 : 당신의 subscribe에서 다음

observables.push(new Observable((observer:any) => { 
    async1(options, (error, info) => { 
     if (error) { 
      observer.next({error}); 
     } else { 
      observer.next({info}); 
      observer.complete(); 
     } 
    }); 
})) 

:

Observable.forkJoin(observables).subscribe(
    arrayData => arrayData.forEach(data => data.info? { 
     console.log(data.info); 
    } : { 
     console.log(data.error); 
    }) 
) 
관련 문제