Dans Angular 2, en utilisant rxjs, j’essayais de convertir une promesse en observable. Comme de nombreux guides en ligne l'ont montré, j'ai utilisé fromPromise
sur Observable
. Ce qui jette une erreur:
Property 'fromPromise' does not exist on type 'typeof Observable'.
Observable a été importé comme:
import { Observable } from "rxjs/Observable";
essayer d'importer fromPromise
comme d'autres opérateurs entraîne une erreur:
import 'rxjs/add/operator/fromPromise';
même si je supprime l'erreur TypeScript, il en résulte une erreur:
(<any>Observable).fromPromise
Erreur:
Uncaught (in promise): TypeError: __WEBPACK_IMPORTED_MODULE_3_rxjs_Observable__.Observable.fromPromise is not a function
Un problème quelque peu similaire a été signalé sur rxjs repo ici mais il n’ya pas de solution non plus.
METTRE À JOUR:
À partir de rxjs
6.0.0-beta.3, les opérateurs et les créateurs observables doivent être importés de rxjs
. De plus, fromPromise
ne fait plus partie de l'API publique et est encapsulé dans la méthode from
.
TL; DR;
METTRE &AGRAVE; JOUR
Pour rxjs 6.0.0, utilisez:
import { from } from 'rxjs';
var observableFromPromise = from(promiseSrc);
METTRE À JOUR:
Après la publication des opérateurs pipeable in rxjs
5.5.x, l’approche des correctifs de type singe est fortement déconseillée. Envisagez d'utiliser l'option de méthode statique.
Réponse originale
À partir de rxjs
5.4.x, fromPromise
peut être utilisé comme méthode statique ou peut être appliqué au prototype Observable
.
Pour le premier, vous pouvez faire ce qui suit:
import { fromPromise } from 'rxjs/observable/fromPromise';
var observableFromPromise = fromPromise(promiseSrc);
Plus d'informations sur cette approche ici
Pour faire la seconde, vous devez changer votre déclaration d'importation:
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromPromise';
var observableFromPromise = Observable.fromPromise(promiseSrc);
Plus d'informations sur cette approche ici
Personnellement, je recommanderais le premier, considérant que la deuxième approche est fondamentalement la première, à la différence que le prototype Observable
est modifié.
comme ce que dit Jota "de" est la réponse.
vous pouvez trouver la référence à partir d'ici
https://www.learnrxjs.io/operators/creation/from.html
Toutefois, si vous souhaitez spécifier "Promise to Observable" , Vous pouvez utiliser "fromPromise" comme ci-dessous.
import { from as fromPromise, Observable} from 'rxjs';
...
private getObservable(): Observable<any> {
return fromPromise(this.promise);
}
private getPromise() {
this.promise = new Promise((resolve, reject) => {
this.service.getPromise()
.then(response => {
// do sth
resolve(response);
});
});
}