2016-06-12 20 views
28

sto imparando RxJS e angolare 2. Diciamo che ho una catena di promessa con più chiamate di funzione asincrona che dipendono dalla precedente uno dei risultati che si presenta come:Chaining osservabili in RxJS

var promiseChain = new Promise((resolve, reject) => { 
    setTimeout(() => { 
    resolve(1); 
    }, 1000); 
}).then((result) => { 
    console.log(result); 

    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     resolve(result + 2); 
    }, 1000); 
    }); 
}).then((result) => { 
    console.log(result); 

    return new Promise((resolve, reject) => { 
     setTimeout(() => { 
     resolve(result + 3); 
     }, 1000); 
    }); 
}); 

promiseChain.then((finalResult) => { 
    console.log(finalResult); 
}); 

I miei tentativi di fare gli stessi unicamente mediante RxJS senza l'uso di promesse prodotto il seguente:

var observableChain = Observable.create((observer) => { 
    setTimeout(() => { 
    observer.next(1); 
    observer.complete(); 
    }, 1000); 
}).flatMap((result) => { 
    console.log(result); 

    return Observable.create((observer) => { 
    setTimeout(() => { 
     observer.next(result + 2); 
     observer.complete() 
    }, 1000); 
    }); 
}).flatMap((result) => { 
    console.log(result); 

    return Observable.create((observer) => { 
    setTimeout(() => { 
     observer.next(result + 3); 
     observer.complete() 
    }, 1000); 
    }); 
}); 

observableChain.subscribe((finalResult) => { 
    console.log(finalResult); 
}); 

produce lo stesso output catena promessa. Le mie domande sono

  1. Sto facendo bene? Ci sono dei miglioramenti relativi a RxJS che posso apportare al codice precedente

  2. Come posso eseguire ripetutamente questa catena osservabile? cioè aggiunta di un altro abbonamento al termine solo produce un ulteriore 6 se mi aspetto per stampare 1, 3 e 6.

    observableChain.subscribe ((finalResult) => { console.log (finalResult); });

    osservableChain.subscribe ((finalResult) => { console.log (finalResult); });

risposta

21

Chi composizione promessa contro Rxjs, in quanto questa è una domanda posta di frequente, è possibile fare riferimento a una serie di domande in precedenza su così, tra le quali:

Fondamentalmente, flatMap è l'equivalente di Promise.then.

Per la seconda domanda, si desidera riprodurre i valori già emessi o si desidera elaborare nuovi valori all'arrivo? Nel primo caso, controllare l'operatore publishReplay. Nel secondo caso, l'abbonamento standard è sufficiente. Tuttavia potrebbe essere necessario essere consapevoli del freddo. contro dicotomia a caldo a seconda della fonte (vedere Hot and Cold observables : are there 'hot' and 'cold' operators? per una spiegazione illustrata del concetto)