RxJS Observables의 Promise.all 동작? 모든 응답을 처리해야합니다. 나는

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

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



답변

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

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


답변

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!' ]


답변

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


답변

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

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


답변