2016-02-15 12 views
5

Mi chiedo se osservabile o promessa può essere utilizzato nel seguente caso d'uso in angolare 2:Angular 2 promessa/osservabile catena due eventi?

Ci sono due attività di upload asincrono direttamente. Mi piacerebbe sapere come posso rilevare che entrambi i compiti sono finiti.

Il mio compito di upload (implementato in promessa ma è essere facilmente modificato per osservabile se necessario) è come questo:

myService.upload('upload1').then(() => { 
}) 

myService.upload('upload2').then(() => { 
}) 

Come catena di questi due eventi insieme in entrambi i promessa o osservabile in modo che so che entrambe le attività sono finite? Grazie

risposta

5

complete viene eseguito quando tutto il flusso di origine sono chiusi.

Rx.Observable.merge(
    myService.upload('upload1'), 
    myService.upload('upload2').subscribe({complete:() => { ... }); 

se si desidera impostare un numero massimo di risultati per aspettare

Rx.Observable.merge(
    myService.upload('upload1'), 
    myService.upload('upload2') 
.take(2) 
.subscribe({complete:() => { ... }); 
+0

ma ho ottenuto un messaggio di errore: *** eccezione originale : ReferenceError: Impossibile trovare la variabile: Rx *** –

+0

Dovrebbe essere qualcosa del genere: *** myService1.merge (myService2) .subscribe() ***. Ma questo non è quello che voglio. Quello che voglio è ottenere l'ultimo evento. –

+0

Hai bisogno dell'ultimo evento, o vuoi solo sapere quando è successo l'ultimo evento, questo è il significato di 'complete' (funziona solo se gli osservabili di origine sono chiusi dal mittente dopo l'evento) –

7

È possibile utilizzare uno degli Combining Operators con osservabili. Observable.zip(), ad esempio, funziona con promesse ...

Observable.zip(
    first, 
    second, 
    function (firstResolvedValue, secondResolvedValue) { 
     return firstResolvedValue && secondResolvedValue; 
    } 
) 

zip accepts a variable number of Observables or Promises as parameters, followed by a function that accepts one item emitted by each of those Observables or resolved by those Promises as input and produces a single item to be emitted by the resulting Observable.

7

Usa forkJoin, che equivale a $ q.all da 1.x angolare (a e b sono osservabili) :

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

È possibile utilizzare Promise.all che restituisce una nuova promessa che si risolve quando tutte le promesse nella matrice di argomento hanno risolto.

Promise.all([myService.upload('upload1'), myService.upload('upload2')]).then(() => { 
    // ... 
}); 

nota, se il metodo myService.upload restituito una promessa, piuttosto che di promessa, è possibile accedere ai valori di ritorno in questo modo:

Promise.all([myService.upload('upload1'), myService.upload('upload2')]) 
    .then((retValue1, retValue2) => { 
    // ... 
});