Angular 1.x에서는 때때로 여러 http
요청을하고 모든 응답을 처리해야합니다. 나는 모든 약속을 배열에 던지고 Promise.all(promises).then(function (results) {...})
.
Angular 2 모범 사례는 RxJS Observable
를 http
요청의 약속을 대체 하는 용도로 사용하는 것으로 보입니다 . http 요청에서 생성 된 두 개 이상의 다른 Observable이있는 경우 해당 항목이 Promise.all()
있습니까?
답변
에뮬레이션을위한보다 간단한 대안 Promise.all
은 forkJoin
연산자 를 사용하는 것 입니다 (모든 관찰 가능 항목을 병렬로 시작하고 마지막 요소를 결합).
- 선적 서류 비치
- 관련 링크 : Cf. RxJS : 세 가지 약속 연결, 결과 구분
약간의 범위를 벗어 났지만 도움이되는 경우 연결 약속의 주제에 대해 간단한 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(...);