2016-02-06 13 views
13

Sto scrivendo un'app in Angular 2 e voglio eseguire più richieste http ed eseguire una funzione sulle risposte.Promise .all() con RxJS

In angolare 1, vorrei scrivere qualcosa di simile $q.all([$http.get(...), $http.get(...), ...]).then(doSomethingWithResponses);

Ma angolari 2 restituisce RxJS osservabili e dopo un po 'di lettura io ancora non riesco a capire come ottenere le risposte di diverse richieste http. Come può essere fatto?

+4

Usa forkJoin, che è l'equivalente per Promise.all –

+4

ho un campione di forkJoin vivo qui http: //www.syntaxsuccess. it/viewarticle/angular-2.0-and-http – TGH

+0

Grazie a @EricMartinez! – benshope

risposta

21

Come ha sottolineato @Eric Martinez, c'è forkJoin. forkJoin esegue tutte le sequenze osservabili in parallelo e raccoglie i loro ultimi elementi.

Rx.Observable.forkJoin([a,b]).subscribe(t=> { 
     var firstResult = t[0]; 
     var secondResult = t[1]; 
}); 
+2

@EricMartinez c'è un modo per un indice nell'array risultante di "dissolversi" se Observable a or Observable b fallisce (o è cancellato o ha un errore o non soddisfa una condizione)? Quindi, per esempio, se l'Observable b fallisce per data1, allora la lunghezza dell'array risultante sarebbe 1 invece che conta per le 2 chiamate che sono state fatte all'interno del blocco di argomenti Observable.forkJoin (...)? –

6

non sono sicuro che ci si vuole utilizzare forkJoin/zip, soprattutto considerando combineLatest è più facile da capire e emetterà su ogni evento sub-stream, mentre forkJoin fondamentalmente campioni su ogni sub-stream aver emesso.

Questo potrebbe venire a morderti più tardi quando si desidera combinare osservatori multi-voce in fondo alla strada.

+1

La differenza è che non si desidera essere avvisati di ogni emit su ogni stream; ti interessa solo quando tutti i flussi hanno emesso dati. Consideralo come l'equivalente osservabile di "Promise.all (promises)" o "$ q.all (promises)". – GFoley83

1

sto imparando RxJS e stavo cercando di fare la stessa cosa con RxJS v5

Sembra che non abbiamo forkJoin su v5 più, quindi ecco come ho ottenuto che funziona (funziona con flatMap o mergeMap, che sono pseudonimi):

const callOne = value => 
    new window.Promise(resolve => 
     setTimeout(() => resolve(value + 10), 3000) 
    ); 

const callTwo = value => 
    new window.Promise(resolve => 
     setTimeout(() => resolve(value + 20), 1000) 
    ); 

Rx.Observable 
    .of(2) 
    .do(() => console.log('querying...')) 
    .mergeMap(number => 
     Rx.Observable.zip(
      Rx.Observable.fromPromise(callOne(number)), 
      Rx.Observable.fromPromise(callTwo(number)) 
     ) 
    ).concatAll() 
    .subscribe(createSubscriber('promises in parallel')); 
+0

Sto esaminando il registro delle modifiche di rxjs e non vedo nulla su forkJoin che viene deprecato https://github.com/ReactiveX/rxjs/blob/master/CHANGELOG.md – benshope

+0

@benshope l'hai eseguito per l'esecuzione v5? Ricevo un errore quando provo ad usare forkJoin e non lo vedo sotto src/operator. – rafaelbiten

+0

Non ho provato a eseguirlo, ma sembra che v5 sia ancora in versione beta. Forse potrebbe aver causato il problema. Felice di impostare questa risposta come corretta se forkJoin è davvero andato – benshope

2

non sarebbe un'opera merge? È possibile sottoscrivere e collegare un gestore alla richiamata onComplete.

ho prima costruire una serie di miei osservabili e quindi utilizzare statica merge:

let obs_ary: any = [obs1, obs2, obs3]; 
Observable.merge(...obs_ary);