Rxjs toPromise comportement différent de observable

J'ai un exemple simple où deux méthodes créent et renvoient une promesse. La deuxième méthode buildRedCar() appelle la première méthode buildCar() , modifie la valeur renvoyée par la promesse et renvoie une autre promesse d'elle-même. Le code appelle alors buildRedCar() , et seulement console.logs le résultat. Cela ne fonctionne pas lors de la conversion en promesses, mais cela fonctionne lorsque vous utilisez des observables droits.

Ne fonctionne pas :

 import * as Rx from 'rx'; function buildCar(): Rx.IPromise<string> { let car = 'Car'; return Rx.Observable.just<string>(car).toPromise(); } function buildRedCar(): Rx.IPromise<string> { let observable = Rx.Observable.create<string>((observer) => { buildCar().then((car) => { observer.onNext('Red ' + car); }); }) return observable.toPromise(); } buildRedCar().then((car) => { console.log(car); }); 

Fonctionne :

 import * as Rx from 'rx'; function buildCar(): Rx.Observable<string> { let car = 'Car'; return Rx.Observable.just<string>(car); } function buildRedCar(): Rx.Observable<string> { let observable = Rx.Observable.create<string>((observer) => { buildCar().subscribe((car) => { observer.onNext('Red ' + car); }); }) return observable; } buildRedCar().subscribe((car) => { console.log(car); }); 

Une idée de pourquoi le comportement différent lorsque la seule différence est de convertir l'observable en promesse avant de revenir?

Lorsque RxJs convertit un Observable par une promesse, il crée une promesse qui produira la dernière valeur de l'observable. Ainsi, la promesse ne sera pas résolue tant que le sous-jacent ne sera pas observable.

Dans votre premier exemple (et dans votre deuxième), vous ne complétez jamais la voiture rouge observable. Par conséquent, la promesse ne se résout jamais. Par conséquent, l'observable qui enveloppe la promesse ne donne jamais de valeur …

Votre deuxième exemple fonctionne car l'abonnement imprime avec impatience la première valeur produite par votre voiture rouge, puisqu'elle arrive, puis "attend" pour obtenir d'autres résultats qui n'arrivent jamais.

Ajouter un appel à onComplete devrait faire fonctionner votre première version:

 observer.onNext('Red ' + car); observer.onComplete();