RxJS Observables의 Promise.all 동작?


87

Angular 1.x에서는 때때로 여러 http요청을하고 모든 응답을 처리해야합니다. 나는 모든 약속을 배열에 던지고 Promise.all(promises).then(function (results) {...}).

Angular 2 모범 사례는 RxJS Observablehttp요청의 약속을 대체 하는 용도로 사용하는 것으로 보입니다 . http 요청에서 생성 된 두 개 이상의 다른 Observable이있는 경우 해당 항목이 Promise.all()있습니까?

답변:


77

에뮬레이션을위한보다 간단한 대안 Promise.allforkJoin연산자 를 사용하는 것 입니다 (모든 관찰 가능 항목을 병렬로 시작하고 마지막 요소를 결합).

약간의 범위를 벗어 났지만 도움이되는 경우 연결 약속의 주제에 대해 간단한 flatMap다음을 사용할 수 있습니다 . Cf. RxJS Promise Composition (데이터 전달)


1
두 번의 호출이 하나의 반환 약속이고 다른 하나의 반환이 관찰되면 forkjoin을 사용할 수 있습니까? 또는 promise.all ()? 또는 아무도, 두 함수가 약속 또는 관찰 가능한 동일한 유형을 반환하도록해야합니까?
조 슬레이

1
매개 변수로 전달 된 옵저버 블이 값을 내 보내지 않으면 forkJoin이 작동하지 않습니다. 나는 무효 Observables은이 여전히 forkJoin 기능을 사용하고 싶지만 그것은 작동하지 않습니다
GOGA Koreli

18

RxJs v6을 사용하여 2019 년 5 월 업데이트

다른 답변이 유용하다는 것을 알았고 Arnaud가 zip사용 에 대해 제공 한 답변에 대한 예를 제공하고 싶었습니다 .

다음 Promise.all은와 rxjs 간의 동등성을 보여주는 스 니펫입니다 zip(또한 rxjs6에서 연산자가 아닌 "rxjs"를 사용하여 zip을 가져 오는 방법에 유의하십시오).

import { zip } from "rxjs";

const the_weather = new Promise(resolve => {
  setTimeout(() => {
    resolve({ temp: 29, conditions: "Sunny with Clouds" });
  }, 2000);
});

const the_tweets = new Promise(resolve => {
  setTimeout(() => {
    resolve(["I like cake", "BBQ is good too!"]);
  }, 500);
});

// Using RxJs
let source$ = zip(the_weather, the_tweets);
source$.subscribe(([weatherInfo, tweetInfo]) =>
  console.log(weatherInfo, tweetInfo)
);

// Using ES6 Promises
Promise.all([the_weather, the_tweets]).then(responses => {
  const [weatherInfo, tweetInfo] = responses;
  console.log(weatherInfo, tweetInfo);
});

둘 다의 출력은 동일합니다. 위를 실행하면 다음이 제공됩니다.

{ temp: 29, conditions: 'Sunny with Clouds' } [ 'I like cake', 'BBQ is good too!' ]
{ temp: 29, conditions: 'Sunny with Clouds' } [ 'I like cake', 'BBQ is good too!' ]

13

forkJoin도 잘 작동하지만 Observable의 마지막 값을 취하는 것에 대해 걱정할 필요가 없기 때문에 combineLatest를 선호합니다 . 이렇게하면 새 값을 내보낼 때마다 업데이트를받을 수 있습니다 (예 : 간격 등에서 가져 오기).


1
이것은 내 현재 요구 사항을 충족하지 못하지만 곧 사용할 것입니다.
Corey Ogburn

4
Promise.all ()과 동일한 동작을 달성하지 못하지만 Promise.any ()와 유사합니다
Purrell

두 번의 호출이 하나의 반환 약속이고 다른 하나의 반환이 관찰되면 forkjoin을 사용할 수 있습니까? 또는 promise.all ()? 또는 아무도, 두 함수가 약속 또는 관찰 가능한 동일한 유형을 반환하도록해야합니까?
조 슬레이

1
@JoeSleiman은 조금 늦었지만, Observable.fromPromise ()Observable.zip () , Obserable.toPromise () 와 Promise.all ()
Arnaud P

11

reactivex.io forkJoin 실제로 점 우편 나를 위해 일을했다 :

let subscription = Observable.zip(obs1, obs2, ...).subscribe(...);

즉, forkJoin은 두 번 이상 내 보내지 않고 그 후에 완료됩니다. 전달 된 Observable의 수명주기가 끝날 때뿐만 아니라 전체적으로 결합 된 값을 내 보내야하는 경우에는 대신 combineLatest 또는 zip을 사용해보세요. " rxjs-dev.firebaseapp.com/api/index/function/forkJoin
Jeffrey Nicholson Carré

2
forkJoin은 모든 옵저버 블이 끝날 때까지 기다리는 반면 zip은 모든 입력이 첫 번째 값을 방출 할 때 배열을 방출합니다. zip이 여러 번 방출 될 수 있습니다. http-calls가 있으면 차이가 없습니다.
hgoebl

그래, 이제 미묘함이 느껴져 건배. 언어 섹션이 확장된다는 사실을 몰랐습니다-_-
Arnaud P
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.