Observable.of - це не функція


192

У мене виникли проблеми з Observable.ofфункцією імпорту в моєму проекті. Мій Intellij все бачить. У своєму коді я маю:

import {Observable} from 'rxjs/Observable';

і в своєму коді я його використовую так:

return Observable.of(res);

Будь-які ідеї?


5
Ознайомтеся з останніми документами, якщо ви використовуєте rxjs6 для правильного імпорту та використання import { of } from 'rxjs'; return of(res); github.com/ReactiveX/rxjs/blob/master/MIGRATION.md#import-paths & github.com/ReactiveX/rxjs/blob/master/…
fidev

Відповіді:


232

Насправді я імпорт зіпсував. В останній версії RxJS ми можемо імпортувати його так:

import 'rxjs/add/observable/of';

21
Після мого 192-го подвійного прийому я помітив, що в своєму коді я імпортую з operator/- rxjs/add/operator/of- замість observable/. D'oh.
EricRobertBrewer

Я виявив, що мені не потрібно використовувати це твердження в одному з кутових проектів. Але в іншому я маю це імпортувати. Я не розумію відмінностей. Чи знаєте ви причини?
niaomingjian

1
Кутова версія, мабуть ?! Мені не доводилося робити це для 4.3.2, але я робив для 5.0.0.
Драгон

@Draghon: Точно так само і зі мною. Мені не довелося це робити за 4.4, зараз - для 5.2. Ще дивніше, мені потрібно лише включити його в один файл, а всі інші .ts-файли просто забрати його і добре пройти.
JP ten Berge

2
Що робити, якщо я не можу знайти модуль "rxjs / add / observable / of"?
Енріко

169

Якщо у когось виникає ця проблема під час використання Angular 6 / rxjs 6, дивіться відповіді тут: Не вдалося використовувати Observable.of у RxJs 6 та Angular 6

Коротше кажучи, вам потрібно імпортувати його так:

import { of } from 'rxjs';

А потім замість дзвонити

Observable.of(res);

просто використовувати

of(res);

2
Дякую! Вирахування імпорту в Rx - це завжди для мене величезне джерело розчарування через мінливість api.
DomenicDatti

43

Хоча це звучить абсолютно дивно, для мене це мало значення для використання "O" на шляху імпорту import {Observable} from 'rxjs/Observable. Повідомлення про помилку з observable_1.Observable.of is not a functionприсутнім залишається, якщо я імпортую спостерігається з rxjs/observable. Дивно, але я сподіваюся, що це допомагає іншим.


42

Якщо ви використовуєте Angular 6/7

import { of } from 'rxjs';

А потім замість дзвонити

Observable.of(res);

просто використовувати

of(res);

Це пояснюється змінами у версії RxJS від 5 до 6, яка ввела безліч змін. Ви можете перевірити, як перенести Кутовий проект тут: rxjs.dev/guide/v6/migration
Edric

29

Моя дурна помилка полягала в тому, що я забув додати, /addвимагаючи спостережуваного.

Було:

import { Observable } from 'rxjs/Observable';
import 'rxjs/observable/of';

Який візуально виглядає нормально, оскільки rxjs/observable/ofфайл, насправді, існує.

Має бути:

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

як зазначав @Shaun_grady, якимось чином це не працює. Я все-таки пішов з його пропозицією
Сонне

20

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

import { of } from 'rxjs/observable/of'

// ...

return of(res)

Це не обхід, це синтаксис для Angular> = 6.0.0. імпорт {of} з "rxjs" для мене був чудовим. Див stackoverflow.com/questions/38067580 / ...
mark_h

18

Просто додати,

якщо ви використовуєте багато з них, ви можете імпортувати все, що використовує

import 'rxjs/Rx'; 

як згадував @Thierry Templier. Але я думаю, що якщо ви використовуєте обмежений оператор, вам слід імпортувати окремих операторів, як

import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/mergeMap';
import 'rxjs/add/observable/of';

як згадував @uksz.

Тому що 'rxjs / Rx' імпортує всі компоненти Rx, що, безумовно, коштує продуктивності.

Порівняння


1
Я виявив, що мені не потрібно використовувати це твердження в одному з кутових проектів. Але в іншому я маю це імпортувати. Я не розумію відмінностей. Чи знаєте ви причини?
niaomingjian

16

Ви також можете імпортувати всіх операторів таким чином:

import {Observable} from 'rxjs/Rx';

7
Я б не рекомендував імпортувати таким чином, оскільки це досить велика бібліотека, і "of" - це дуже мала її частина.
methgaard

2
@methgaard import { Observable } from 'rxjs/Observable' import 'rxjs/add/observable/of';не працює. Тільки import {Observable} from 'rxjs/Rx';працює. Версія 5.4.2
niaomingjian

@methgaard Вибачте Я зробив помилку. Справа в тому, що я отримав Observable_1.Observable.of(...).delay(...).timeout is not a function. Я не користувавсяimport 'rxjs/add/operator/timeout'
niaomingjian

Це також збільшує розмір
пачки

5

Я використовую Angular 5.2 та RxJS 5.5.6

Цей код не працює:

     import { Observable,of } from 'rxjs/Observable';

     getHeroes(): Observable<Hero[]> {
        return of(Hero[]) HEROES;

      }

Нижче працює код:

    import { Observable } from 'rxjs/Observable';
    import { Subscriber } from 'rxjs/Subscriber';

     getHeroes(): Observable<Hero[]> 
     {
          return Observable.create((observer: Subscriber<any>) => {
              observer.next(HEROES);
              observer.complete();
          });

      }

Спосіб виклику:

this.heroService.getHeroes()
      .subscribe(heroes => this.heroes = heroes);

Я думаю, вони можуть перемістити / змінити () функціональність у RxJS 5.5.2


4

Це має працювати належним чином, просто спробуйте.

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

4
// "rxjs": "^5.5.10"
import { of } from 'rxjs/observable/of';

.... 
return of(res)

Це відповідь лише для коду. Чи поясніть, будь ласка, те, що ви намагаєтесь запропонувати?
Пітер Віпперманн

1
Привіт, ми повинні імпортувати лише потрібного нам оператора, а не весь "Помітний" через проблеми з продуктивністю. У новій версії (^ 5.5.10) правильним способом імпорту оператора "of" є: import {of} з 'rxjs / observable / of' ... Це працює для мого випадку. Я відредагую свою резолюцію. Дякую Петру.
letanthang

4

Оновлено з кутових 5 / Rxjs 5 до кутових 6 / Rxjs 6?

Ви повинні змінити свій імпорт та інформацію. Перегляньте допис у блозі Даміена

Tl; dr:

import { Observable, fromEvent, of } from 'rxjs';

const yourResult = Observable
    .create(of(yourObservable))
    .startWith(null)
    .map(x => x.someStringProperty.toLowerCase());

//subscribe to keyup event on input element
Observable
    .create(fromEvent(yourInputElement, 'keyup'))
    .debounceTime(5000)
    .distinctUntilChanged()
    .subscribe((event) => {
        yourEventHandler(event);
    });

1
Використання 6.0, спроба підписатися на Observable.create (of (val)) призвела до "this._subscribe is not a function". Натомість я успішно створив спостережуване, просто зателефонувавши "з (val)".
Джим Норман

3

RxJS 6

Під час оновлення до версії 6 RxJSбібліотеки та не використовує rxjs-compatпакет наступний код

import 'rxjs/add/observable/of';   
  // ...
  return Observable.of(res);

має бути змінено на

import { of } from 'rxjs';
  // ...
  return of(res);

3

Для мене (Angular 5 & RxJS 5) імпорт автозаповнення запропонував:

import { Observable } from '../../../../../node_modules/rxjs/Observable';

в той час , щоб повинно бути (з усе статичними операторами from, of, ЕСТ працює нормально:

import { Observable } from 'rxjs/Observable';

2

У мене сьогодні була ця проблема. Я використовую systemjs для завантаження залежностей.

Я завантажував Rxjs так:

...
    paths: {
        "rxjs/*": "node_modules/rxjs/bundles/Rx.umd.min.js"
    },
...

Замість шляхів використання використовуйте це:

var map = {
...
'rxjs':                       'node_modules/rxjs',
...
}

var packages = {
...
'rxjs': { main: 'bundles/Rx.umd.min.js', defaultExtension: 'js' }
...
}

Ця невелика зміна способу завантаження бібліотеки виправляла мою проблему.



2

Для кутових 5+:

import { Observable } from 'rxjs/Observable';повинен працювати. Пакет спостерігачів повинен відповідати імпорту, import { Observer } from 'rxjs/Observer';якщо ви також використовуєте спостерігачі

import {<something>} from 'rxjs'; робить величезний імпорт, тому краще уникати цього.


1
import 'rxjs/add/observable/of';

показує вимогу rxjs-compat

require("rxjs-compat/add/observable/of");

У мене цього не було встановлено. Встановлено

npm install rxjs-compat --save-dev

і перестановка вирішила мою проблему.



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