Observable.of non è una funzione


192

Sto riscontrando problemi con la Observable.offunzione di importazione nel mio progetto. Il mio Intellij vede tutto. Nel mio codice ho:

import {Observable} from 'rxjs/Observable';

e nel mio codice lo uso così:

return Observable.of(res);

Qualche idea?


5
Consulta gli ultimi documenti se stai utilizzando rxjs6 sull'importazione e sull'utilizzo corretti import { of } from 'rxjs'; return of(res); github.com/ReactiveX/rxjs/blob/master/MIGRATION.md#import-paths & github.com/ReactiveX/rxjs/blob/master/…
fidev,

Risposte:


232

In realtà ho incasinato le importazioni. Nell'ultima versione di RxJS possiamo importarlo in questo modo:

import 'rxjs/add/observable/of';

21
Dopo il mio 192 ° double-take, ho notato che nel mio codice stavo importando da operator/- rxjs/add/operator/of- anziché observable/. D'oh.
EricRobertBrewer

Ho scoperto che non ho bisogno di usare questa affermazione in uno dei progetti angolari. Ma nell'altro, devo importarlo. Non capisco le differenze. Conosci i motivi?
niaomingjian,

1
Versione angolare, forse ?! Non ho dovuto farlo per 4.3.2 ma per 5.0.0.
Draghon il

@Draghon: esattamente lo stesso con me. Non ho dovuto farlo per 4.4, adesso per 5.2. Ancora più strano, devo solo includerlo in un file e tutti gli altri file .ts lo raccolgono e sono pronti.
JP dieci Berge,

2
Cosa succede se non riesco a trovare il modulo "rxjs / add / observable / of"?
Enrico,

169

Se qualcuno ha questo problema durante l'utilizzo di Angular 6 / rxjs 6, vedi le risposte qui: Impossibile utilizzare Observable.of in RxJs 6 e Angular 6

In breve, è necessario importarlo in questo modo:

import { of } from 'rxjs';

E poi invece di chiamare

Observable.of(res);

basta usare

of(res);

2
Grazie! Capire le importazioni in Rx è sempre un'enorme fonte di frustrazione per me a causa della volatilità dell'api.
DomenicDatti,

43

Anche se suona assolutamente strano, con me importava capitalizzare la "O" nel percorso di importazione di import {Observable} from 'rxjs/Observable. Il messaggio di errore con observable_1.Observable.of is not a functionrimane presente se importare l'Osservabile da rxjs/observable. Strano ma spero che aiuti gli altri.


42

Se si utilizza Angular 6/7

import { of } from 'rxjs';

E poi invece di chiamare

Observable.of(res);

basta usare

of(res);

Ciò è dovuto alle modifiche apportate alla versione RxJS dalla 5 alla 6 che hanno introdotto molte modifiche sostanziali. Puoi scoprire come migrare il tuo progetto angolare qui: rxjs.dev/guide/v6/migration
Edric

29

Il mio sciocco errore è stato che ho dimenticato di aggiungere /addquando ho richiesto l'osservabile.

Era:

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

Che visivamente sembra OK rxjs/observable/ofin quanto esiste un file.

Dovrebbe essere:

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

come ha sottolineato @Shaun_grady, in qualche modo questo non funziona. Sono andato con la sua proposta
Sonne il

20

Il patching non funzionava per me, per qualsiasi motivo, quindi ho dovuto ricorrere a questo metodo:

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

// ...

return of(res)

Questa non è una soluzione, questa è la sintassi di Angular> = 6.0.0. import {of} da 'rxjs' andava bene per me. Vedere stackoverflow.com/questions/38067580/...
mark_h

18

Solo per aggiungere,

se ne usi molti, puoi importarli tutti

import 'rxjs/Rx'; 

come menzionato da @Thierry Templier. Ma penso che se stai usando un operatore limitato, allora dovresti importare un singolo operatore come

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

come menzionato da @uksz.

Perché 'rxjs / Rx' importerà tutti i componenti Rx che sicuramente costano le prestazioni.

Confronto


1
Ho scoperto che non ho bisogno di usare questa affermazione in uno dei progetti angolari. Ma nell'altro, devo importarlo. Non capisco le differenze. Conosci i motivi?
niaomingjian,

16

Puoi anche importare tutti gli operatori in questo modo:

import {Observable} from 'rxjs/Rx';

7
Non consiglierei l'importazione in questo modo, dato che si tratta di una libreria abbastanza grande e "of" è una parte molto piccola di essa.
Methgaard

2
@methgaard import { Observable } from 'rxjs/Observable' import 'rxjs/add/observable/of';non funziona. import {Observable} from 'rxjs/Rx';Funziona solo La versione è 5.4.2
niaomingjian,

@methgaard mi dispiace. Ho fatto un errore. Il fatto è che ho capito Observable_1.Observable.of(...).delay(...).timeout is not a function. Non ho usatoimport 'rxjs/add/operator/timeout'
niaomingjian il

Aumenta anche la dimensione del fascio
Amirhossein Mehrvarzi,

5

Sto usando Angular 5.2 e RxJS 5.5.6

Questo codice non ha funzionato:

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

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

      }

Sotto il codice ha funzionato:

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

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

      }

Metodo di chiamata:

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

Penso che potrebbero spostare / modificare la funzionalità () in RxJS 5.5.2


4

Questo dovrebbe funzionare correttamente, provalo.

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

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

.... 
return of(res)

Questa è una risposta di solo codice. Potresti spiegare cosa stai cercando di suggerire?
Peter Wippermann,

1
Salve, dovremmo importare solo l'operatore di cui abbiamo bisogno, non l'intero "Osservabile" a causa di problemi di prestazioni. Nella nuova versione (^ 5.5.10) il modo giusto per importare l'operatore "of" è: importare {of} da 'rxjs / osservable / of' ... Funziona nel mio caso. Modificherò la mia risoluzione. Grazie Peter.
letanthang,

4

Aggiornato da Angular 5 / Rxjs 5 a Angular 6 / Rxjs 6?

È necessario modificare le importazioni e l'istanza. Dai un'occhiata al post sul blog di Damien

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
Utilizzando 6.0, il tentativo di abbonarsi a Observable.create (of (val)) ha prodotto "this._subscribe non è una funzione". Invece, ho creato con successo un osservabile semplicemente chiamando "of (val)".
Jim Norman,

3

RxJS 6

Quando si aggiorna alla versione 6 della RxJSlibreria e non si utilizza il rxjs-compatpacchetto il seguente codice

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

deve essere cambiato in

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

3

Per me (Angular 5 e RxJS 5) l'importazione del completamento automatico ha suggerito:

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

mentre al dovrebbe essere (con tutti gli operatori statici from, of, ect funzionare bene:

import { Observable } from 'rxjs/Observable';

2

Ho avuto questo problema oggi. Sto usando systemjs per caricare le dipendenze.

Stavo caricando Rxjs in questo modo:

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

Invece di usare percorsi usa questo:

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

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

Questo piccolo cambiamento nel modo in cui systemjs carica la libreria ha risolto il mio problema.


La domanda si applica ad Angular 2. Non funziona bene con il modulo UMD RxJS .
Estus Flask,

2

Per Angular 5+:

import { Observable } from 'rxjs/Observable';dovrebbe funzionare. Il pacchetto di osservatori dovrebbe corrispondere anche all'importazione import { Observer } from 'rxjs/Observer';se stai usando osservatori

import {<something>} from 'rxjs'; fa un'importante importazione quindi è meglio evitarlo.


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

mostra un requisito di rxjs-compat

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

Non ho installato questo. Installato da

npm install rxjs-compat --save-dev

e la riesecuzione risolto il mio problema.



0

In qualche modo anche Webstorm l'ha resa così import {of} from 'rxjs/observable/of'; e tutto ha iniziato a funzionare

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.