javascript - Promise.all comportamento com RxJS Observables?




angularjs (3)

A alternativa mais direta para emular o Promise.all é usar o operador forkJoin (ele inicia todos os observáveis ​​em paralelo e une seus últimos elementos):

Um pouco fora do escopo, mas, caso ajude, em matéria de promessas de encadeamento, você pode usar um flatMap simples: Cf. Composição do RxJS Promise (passando dados)

No Angular 1.x, às vezes, eu precisava fazer várias solicitações http e fazer algo com todas as respostas. Eu lançaria todas as promessas em uma matriz e chamaria Promise.all(promises).then(function (results) {...}) .

As melhores práticas do Angular 2 parecem apontar para o uso do Observable do RxJS como um substituto das promessas nos pedidos de http . Se eu tiver dois ou mais Observables diferentes criados a partir de solicitações HTTP, eles equivalem a Promise.all() ?


No reactivex.io forkJoin, na verdade, aponta para Observable.zip() , que fez o trabalho para mim:

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

Atualize maio de 2019 usando o RxJs v6

As outras respostas foram úteis e desejaram oferecer um exemplo para a resposta oferecida por Arnaud sobre o uso de zip .

Aqui está um trecho que mostra a equivalência entre Promise.all e o zip do rxjs (observe também no rxjs6 como o zip agora é importado usando "rxjs" e não como um operador).

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);
});

A saída de ambos é a mesma. A execução do procedimento acima fornece:

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






observable