fromPromise не існує для типу Observable


76

У Angular 2 за допомогою rxjs я намагався перетворити Promise на Observable. Як багато хто з гідів онлайн показав я fromPromiseна Observable. Що видає помилку:

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

Спостережуване було імпортовано, як:

import { Observable } from "rxjs/Observable";

спроба імпортувати, fromPromiseяк інші оператори, призводить до помилки:

import 'rxjs/add/operator/fromPromise';

навіть якщо я пригнічую помилку машинопису, це все одно призводить до помилки:

(<any>Observable).fromPromise

Помилка:

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

Дещо схожа проблема була повідомлена про rxjs repo тут, але там також немає рішення.


1
прохання перевірити версію typecript та rxjs, які ви використовуєте, Observable.fromPromise просто повинен працювати. перевірити наявність файлу зPrommis.js у rxjs -> додати -> спостережуваний -> відPromise.js
Джоравар Сінгх

rxjs 5.4.0 машинопис 2.3.4
Ахмад

і fromePromise.js справді існує
Ахмад

Це пояснює. Перевірте останню версію, і вона повинна містити цей файл. Якщо ви використовуєте останню версію, просто видаліть свої вузлові модулі та виконайте npm i.
Джоравар Сінгх

Відповіді:


166

ОНОВЛЕННЯ:

Починаючи з rxjs6.0.0-beta.3, оператори та спостережувані творці повинні імпортуватися з rxjs. Більше того, fromPromiseвін більше не є частиною загальнодоступного API, і він загорнутий у fromметод.

TL; DR;

ОНОВЛЕННЯ

Для rxjs 6.0.0 використовуйте:

import { from } from 'rxjs';

var observableFromPromise =  from(promiseSrc);

ОНОВЛЕННЯ:

Після випуску трубопровідних операторів у rxjsверсії 5.5.x настійно не рекомендується застосовувати мавповий патч. Подумайте про використання варіанту статичного методу.

Оригінальна відповідь

Починаючи з rxjs5.4.x, fromPromiseможе використовуватися як статичний метод або може бути вкладений у Observableпрототип.

Спочатку ви можете зробити наступне:

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

var observableFromPromise = fromPromise(promiseSrc);

Детальніше про цей підхід тут

Щоб зробити друге, вам потрібно змінити оператор імпорту:

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

var observableFromPromise = Observable.fromPromise(promiseSrc);

Детальніше про цей підхід тут

Особисто я б порекомендував перший, враховуючи, що 2-й підхід є в основному 1-м, з тією різницею, що Observableпрототип змінено.


4

на зразок того, що Джота сказала "від" - це відповідь.

посилання ви можете знайти тут

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);
        });
    });
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.