web-dev-qa-db-fra.com

fromPromise n'existe pas sur le type Observable

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.

39
Ahmad

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é.

108
Jota.Toledo

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);
        });
    });
}
1
Energy