Obserwowalny. Nie jest funkcją


192

Mam problem z Observable.offunkcją importowania w moim projekcie. Mój Intellij widzi wszystko. W moim kodzie mam:

import {Observable} from 'rxjs/Observable';

i w moim kodzie używam go w ten sposób:

return Observable.of(res);

Jakieś pomysły?


5
Zapoznaj się z najnowszymi dokumentami, jeśli używasz rxjs6 do poprawnego importu i użytkowania import { of } from 'rxjs'; return of(res); github.com/ReactiveX/rxjs/blob/master/MIGRATION.md#import-paths & github.com/ReactiveX/rxjs/blob/master/…
— fidev

Odpowiedzi:


232

Właściwie to pomieszałem import. W najnowszej wersji RxJS możemy go zaimportować w następujący sposób:

import 'rxjs/add/observable/of';

21
Po moim 192nd Double-Take, zauważyłem, że w moim kodu byłem imporcie z operator/- rxjs/add/operator/of- zamiast observable/. Nie.
— EricRobertBrewer

Odkryłem, że nie muszę używać tego oświadczenia w jednym z kątowych projektów. Ale w drugim muszę go zaimportować. Nie rozumiem różnic. Znasz powody?
— niaomingjian

1
Może wersja kątowa ?! Nie musiałem tego robić w wersji 4.3.2, ale zrobiłem to w wersji 5.0.0.
— Draghon

@Draghon: Dokładnie tak samo ze mną. Nie musiałem tego robić dla 4.4, teraz dla 5.2. Co dziwniejsze, muszę tylko dołączyć go do jednego pliku, a wszystkie inne pliki .ts po prostu go podnoszą i są gotowe.
— JP ten Berge

2
Co się stanie, jeśli otrzymam Nie mogę znaleźć modułu „rxjs / add / observable / of”?
— Enrico

169

Jeśli ktoś ma ten problem podczas korzystania z Angular 6 / rxjs 6, zobacz odpowiedzi tutaj: Nie można użyć Observable.of w RxJs 6 i Angular 6

Krótko mówiąc, musisz go zaimportować w następujący sposób:

import { of } from 'rxjs';

A potem zamiast dzwonić

Observable.of(res);

po prostu użyj

of(res);

2
Dziękuję Ci! Zrozumienie importu w Rx jest dla mnie zawsze tak wielkim źródłem frustracji ze względu na zmienność API.
— DomenicDatti,

43

Chociaż brzmi to absolutnie dziwnie, dla mnie liczyło się pisanie wielkimi literami „O” na ścieżce importu import {Observable} from 'rxjs/Observable. Komunikat o błędzie z observable_1.Observable.of is not a functionpozostaje obecny, jeśli zaimportuję obiekt Observable rxjs/observable. Dziwne, ale mam nadzieję, że to pomaga innym.


42

Jeśli używasz Angular 6/7

import { of } from 'rxjs';

A potem zamiast dzwonić

Observable.of(res);

po prostu użyj

of(res);

Wynika to ze zmian w wersji RxJS z 5 na 6, które wprowadziły wiele przełomowych zmian. Możesz sprawdzić, jak przeprowadzić migrację projektu Angular tutaj: rxjs.dev/guide/v6/migration
— Edric

29

Moim głupim błędem było to, że zapomniałem dodać, /addgdy wymagałem obserwacji.

Był:

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

Który wizualnie wygląda OK, ponieważ rxjs/observable/ofplik faktycznie istnieje.

Powinien być:

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

jak zauważył @Shaun_grady, jakoś to nie działa. Poszedłem z jego propozycją
— Sonne,

20

Łatki nie działały dla mnie z jakiegokolwiek powodu, więc musiałem skorzystać z tej metody:

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

// ...

return of(res)

To nie jest obejście, to jest składnia Angular> = 6.0.0. import {of} z 'rxjs' był dla mnie w porządku. Zobacz stackoverflow.com/questions/38067580/…
— mark_h

18

Po prostu dodaj

jeśli używasz wielu z nich, możesz zaimportować wszystkie za pomocą

import 'rxjs/Rx'; 

jak wspomniano w @Thierry Templier. Ale myślę, że jeśli używasz ograniczonego operatora, powinieneś zaimportować indywidualnego operatora jak

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

jak wspomniał @uksz.

Ponieważ „rxjs / Rx” zaimportuje wszystkie komponenty Rx, które zdecydowanie kosztują wydajność.

Porównanie


1
Odkryłem, że nie muszę używać tego oświadczenia w jednym z kątowych projektów. Ale w drugim muszę go zaimportować. Nie rozumiem różnic. Znasz powody?
— niaomingjian

16

Możesz również zaimportować wszystkich operatorów w ten sposób:

import {Observable} from 'rxjs/Rx';

7
Nie polecam importowania w ten sposób, ponieważ jest to dość duża biblioteka, a „of” to bardzo mała jej część.
— Metgaard

2
@methgaard import { Observable } from 'rxjs/Observable' import 'rxjs/add/observable/of';nie działa. import {Observable} from 'rxjs/Rx';Działa tylko . Wersja to 5.4.2
— niaomingjian,

@methgaard Przepraszam. Popełniłem błąd. Faktem jest, że mam Observable_1.Observable.of(...).delay(...).timeout is not a function. Nie korzystałemimport 'rxjs/add/operator/timeout'
— niaomingjian,

Zwiększa także rozmiar pakietu
— Amirhossein Mehrvarzi

5

Używam Angulara 5.2 i RxJS 5.5.6

Ten kod nie działał:

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

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

      }

Poniższy kod działał:

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

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

      }

Metoda wywołania:

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

Myślę, że mogą przenieść / zmienić funkcjonalność () w RxJS 5.5.2


4

To powinno działać poprawnie, po prostu spróbuj.

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

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

.... 
return of(res)

To jest odpowiedź tylko na kod. Czy mógłbyś wyjaśnić, co próbujesz zasugerować?
— Peter Wippermann

1
Cześć, powinniśmy importować tylko operatora, którego potrzebujemy, a nie cały „Obserwowalny” z powodu problemów z wydajnością. W nowej wersji (^ 5.5.10) właściwym sposobem importowania operatora „of” jest: import {of} z 'rxjs / observable / of' ... To działa w moim przypadku. Zmienię swoją rozdzielczość. Dzięki Peter.
— letanthang

4

Uaktualniono z Angular 5 / Rxjs 5 do Angular 6 / Rxjs 6?

Musisz zmienić import i instancję. Sprawdź post na blogu Damiena

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
Przy użyciu wersji 6.0 próba subskrypcji Observable.create (of (val)) zaowocowała „this._subscribe nie jest funkcją”. Zamiast tego udało mi się stworzyć obserwowalne, po prostu nazywając „of (val)”.
— Jim Norman

3

RxJS 6

Przy aktualizacji do wersji 6 RxJSbiblioteki i nie korzystaniu z rxjs-compatpakietu następujący kod

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

należy zmienić na

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

3

Dla mnie (Angular 5 i RxJS 5) import autouzupełniania sugerował:

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

natomiast do powinny być (ze wszystkimi operatorami statycznych from, of, ect grzywny pracy:

import { Observable } from 'rxjs/Observable';

2

Miałem dzisiaj ten problem. Używam systemjs do ładowania zależności.

Ładowałem Rxj w ten sposób:

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

Zamiast używać ścieżek użyj tego:

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

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

Ta niewielka zmiana w sposobie ładowania biblioteki systemjs naprawiła mój problem.



2

Dla Angular 5+:

import { Observable } from 'rxjs/Observable';powinno działać. Pakiet obserwatora powinien również pasować do importu, import { Observer } from 'rxjs/Observer';jeśli używasz tego obserwatora

import {<something>} from 'rxjs'; robi ogromny import, więc lepiej tego uniknąć.


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

pokazuje wymaganie rxjs-kompatybil

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

Nie zainstalowałem tego. Zainstalowany przez

npm install rxjs-compat --save-dev

a ponowne uruchomienie rozwiązało mój problem.



0

Jakoś nawet Webstorm tak to zrobił import {of} from 'rxjs/observable/of'; i wszystko zaczęło działać

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.