web-dev-qa-db-ja.com

fromPromiseはObservable型には存在しません

Rxjsを使用したAngular 2では、PromiseをObservableに変換しようとしていました。オンラインガイドの多くが示したように、fromPromiseObservableを使用しました。エラーがスローされます:

Property 'fromPromise' does not exist on type 'typeof Observable'.

Observableは次のようにインポートされました。

import { Observable } from "rxjs/Observable";

他の演算子のようにfromPromiseをインポートしようとすると、エラーが発生します。

import 'rxjs/add/operator/fromPromise';

typeScriptエラーを抑制してもエラーが発生します:

(<any>Observable).fromPromise

エラー:

Uncaught (in promise): TypeError: __WEBPACK_IMPORTED_MODULE_3_rxjs_Observable__.Observable.fromPromise is not a function

Rxjsリポジトリで多少似た問題が報告されました here しかし、解決策もありません。

55
Ahmad

UPDATE:

rxjs 6.0.0-beta.3の時点で、演算子と観察可能な作成者はrxjsからインポートする必要があります。さらに、fromPromiseはパブリックAPIの一部ではなくなり、fromメソッドにラップされました。

TL; DR;

UPDATE

Rxjs 6.0.0の場合:

import { from } from 'rxjs';

var observableFromPromise =  from(promiseSrc);

UPDATE:

rxjs 5.5.xの pipeable operator のリリース後、モンキーパッチアプローチは強く推奨されません。静的メソッドオプションの使用を検討してください。

元の答え

rxjs 5.4.xの時点で、fromPromiseは静的メソッドとして使用するか、Observableプロトタイプにパッチを適用できます。

最初は、次のことができます。

import { fromPromise } from 'rxjs/observable/fromPromise';

var observableFromPromise = fromPromise(promiseSrc);

このアプローチに関する詳細情報 こちら

2番目を行うには、importステートメントを変更する必要があります。

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromPromise';

var observableFromPromise = Observable.fromPromise(promiseSrc);

このアプローチに関する詳細情報 こちら

個人的には、Observableプロトタイプが変更されているという違いはありますが、2番目のアプローチは基本的には1番目であるため、最初のアプローチをお勧めします。

126
Jota.Toledo

ジョタが「から」と言ったことが答えです。

ここから参照を見つけることができます

https://www.learnrxjs.io/operators/creation/from.html

ただし、「Promise to Observable」を指定する場合は、次のように「fromPromise」を使用できます。

  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