Observable.combineLatest
과의 차이점이 무엇인지 궁금 Observable.forkJoin
하십니까? 내가 볼 수있는 한, 유일한 차이점은 forkJoin
Observable이 완료 될 것으로 예상 combineLatest
하고 최신 값 을 반환한다는 것입니다.
답변:
forkJoin
모든 입력 관찰 가능 항목을 완료해야 할 뿐만 아니라 입력 관찰 가능 항목에 의해 생성 된 마지막 값의 배열 인 단일 값을 생성하는 관찰 가능 항목도 반환합니다. 즉, 관찰 가능한 마지막 입력이 완료 될 때까지 기다린 다음 단일 값을 생성하고 완료됩니다.
반대로 combineLatest
모든 입력 관찰 가능 항목이 적어도 하나의 값을 생성하면 입력 관찰 가능 항목이 수행 할 때마다 새 값을 생성하는 Observable을 반환합니다. 이것은 무한한 값을 가질 수 있고 완전하지 않을 수 있음을 의미합니다. 또한 입력 관찰 가능 항목이 값을 생성하기 전에 완료 할 필요가 없음을 의미합니다.
.catch()
, .onErrorResumeNext()
및 가능 .retry()
(Http 호출이 간헐적으로 실패 할 수있는 경우)이 포함됩니다.
combineLatest()
프로젝션 함수를 제공하여 입력 관찰 가능 항목의 최신 값에서 출력 값을 생성하는 방법을 지정할 수 있습니다. 기본적으로 지정하지 않으면 최근 방출 된 값의 배열이 표시됩니다.
또한:
combineLatest
내부적으로를 사용합니다 concat
. 즉, 다음으로 이동하기 전에 배열의 각 관찰 가능 항목에 대해 값을 얻어야합니다.
// partial source of static combineLatest (uses the rxjs/operators combineLatest internally):
// If you're using typescript then the output array will be strongly typed based on type inference
return function (source) { return source.lift.call(from_1.from([source].concat(observables)),
new combineLatest_1.CombineLatestOperator(project)); };
소스 옵저버 블이 3 개 있고 각각 실행하는 데 5 초가 걸리면 실행하는 데 15 초가 걸립니다 combineLatest
. 반면 forkJoin
들이 병렬로 실행는 5 초 정도 걸릴 수 있도록.
따라서 주문이 시행되지 않는 곳 forkJoin
과 다소 비슷 Promise.all(...)
합니다.
Observable 오류가 발생 combineLatest
하면 후속 항목이 실행되지 않지만 forkJoin
모두 실행됩니다. 따라서 combineLatest
관찰 가능 항목의 '시퀀스'를 실행하고 결과를 모두 함께 수집하는 데 유용 할 수 있습니다.
고급 참고 : 소스 Observable이 이미 '실행 중'(다른 항목에 의해 구독 됨)이고 사용중인 share
경우이 동작이 표시되지 않습니다.
고급 참고 사항 : CombineLatest는 항상 각 소스의 최신 정보를 제공하므로 소스 Observable 중 하나가 여러 값을 방출하면 최신 정보를 얻을 수 있습니다. 각 소스에 대해 단일 값을 얻고 다음 소스로 이동하는 것이 아닙니다. 각 소스 Observable에 대해 '다음 사용 가능한 항목'만 가져 오도록해야하는 경우 .pipe(take(1))
입력 배열에 추가 할 때 소스 Observable에 추가 할 수 있습니다 .
concat()
에서 무엇을하고 있는지 잘못 해석했다고 생각합니다 combineLatest()
. Array.prototype.concat
RxJS concat
방법이 아닌 방법 처럼 보입니다 . 내가 옳다고 가정하면이 대답은 오해의 소지가 있고 부정확하며, combineLatest()
Observable을 순서대로 하나씩 실행하지 않습니다. .NET과 동일하게 병렬로 실행합니다 forkJoin()
. 차이는 생성되는 값의 수와 소스 관찰 가능 항목이 완료되어야하는지 여부에 있습니다.
[source].concat(observables)
" combineLatest
내부적으로 사용한다 concat
" 는 말이 의미하는 바라고 가정합니다 . 배열 연결을 RxJS 연결과 혼동하는 것 같습니다. 후자는 실제로 입력 관찰 가능 항목을 순서대로 실행하고 각각이 완료 될 때까지 기다립니다. 그러나 그것은에서 사용되지 않으며 combineLatest()
완전히 별개의 연산자입니다.
combineLatest()
하고 forkJoin()
모두 병렬로 실행합니다. 아래 코드를 실행하면 둘 다에 대해 약 5000이 출력됩니다. const start = new Date().getTime();
combineLatest([of(null).pipe(delay(5000)), of(null).pipe(delay(5000)), of(null).pipe(delay(5000))]).subscribe(() => console.log(new Date().getTime() - start));
forkJoin([of(null).pipe(delay(5000)), of(null).pipe(delay(5000)), of(null).pipe(delay(5000))]).subscribe(() => console.log(new Date().getTime() - start));
forkJoin- 모든 Observable이 완료되면 각각에서 마지막으로 방출 된 값을 내 보냅니다 .
CombineLatest -Observable이 값을 방출하면 각각의 최신 값을 방출합니다.
사용법은 매우 비슷하지만 forkJoin 과는 달리 combineLatest 구독을 취소하는 것을 잊지 마십시오 .
combineLatest()
및forkJoin()
관찰을 만드는 기능을한다. 동일하지만 구문이 다릅니다. 혼동하지 마십시오combineLatest
에서rxjs/operators
하는 것은 'pipeable'연산자입니다. 잘못된 것을 가져 오면 오류가 발생합니다.