Observable.of不是函数


191

Observable.of我的项目中的导入功能有问题。我的Intellij看到了一切。在我的代码中,我有:

import {Observable} from 'rxjs/Observable';

在我的代码中,我像这样使用它:

return Observable.of(res);

有任何想法吗?


5
如果您使用的正确的进口和使用rxjs6 Google Checkout的最新文档import { of } from 'rxjs'; return of(res); github.com/ReactiveX/rxjs/blob/master/MIGRATION.md#import-pathsgithub.com/ReactiveX/rxjs/blob/master/...
fidev

Answers:


232

其实我的进口一团糟。在最新版本的RxJS中,我们可以这样导入它:

import 'rxjs/add/observable/of';

21
我的第192个的Double-Take后,我注意到,在我的代码是从进口operator/- rxjs/add/operator/of-而不是observable/。天啊
EricRobertBrewer

我发现我不需要在一个有角度的项目中使用此语句。但是在另一项中,我必须将其导入。我不明白这些差异。你知道原因吗?
niaomingjian

1
角版本,也许吗?对于4.3.2,我不必这样做,但对于5.0.0,我可以这样做。
Draghon

@Draghon:和我完全一样。我不必为4.4做,现在就为5.2。更奇怪的是,我只需要将其包含在一个文件中,而所有其他.ts文件只需将其拾取即可。
JP 10 Berge,

2
如果得到无法找到模块“ rxjs / add / observable / of”怎么办?
恩里科

167

如果有人在使用Angular 6 / rxjs 6时遇到此问题,请在此处查看答案: 无法在RxJs 6和Angular 6中使用Observable.of

简而言之,您需要像这样导入它:

import { of } from 'rxjs';

然后不要打电话

Observable.of(res);

只是使用

of(res);

2
谢谢!由于api的波动性,弄清Rx中的进口对我来说总是一个巨大的挫败源。
DomenicDatti

43

尽管听起来绝对有些奇怪,但对我来说,在的导入路径中大写“ O”很重要import {Observable} from 'rxjs/Observableobservable_1.Observable.of is not a function如果我从导入Observable,则错误消息始终存在rxjs/observable。奇怪,但我希望它能帮助其他人。


40

如果您使用的是Angular 6/7

import { of } from 'rxjs';

然后不要打电话

Observable.of(res);

只是使用

of(res);

这是因为RxJS版本从5更改为6,引入了许多重大更改。:你可以看看这里怎么迁移角项目rxjs.dev/guide/v6/migration
埃德里克

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指出的那样,这不起作用。我
同意


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'9

@methgaard对不起。我犯了一个错误。事实是我明白了Observable_1.Observable.of(...).delay(...).timeout is not a function。我没有使用import 'rxjs/add/operator/timeout'
niaomingjian

这也增加了捆的大小
Amirhossein Mehrvarzi

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
嗨,在这里,由于性能问题,我们应该仅导入所需的运算符,而不是整个“ Observable”。在新版本(^ 5.5.10)中,导入“ of”运算符的正确方法是:从'rxjs / observable / of'中导入{of} ...适用于我的情况。我将编辑我的决议。谢谢彼得。
letanthang '18

4

从Angular 5 / Rxjs 5升级到Angular 6 / Rxjs 6?

您必须更改导入和实例化。查看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
使用6.0,尝试订阅Observable.create(of(val))导致“ this._subscribe不是函数”。相反,我仅通过调用“ of(val)”就成功创建了一个可观察对象。
Jim Norman

3

RxJS 6

升级到RxJS库的版本6 而不使用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';

同时,以应(与所有静态运营商fromof,ECT做工精细:

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' }
...
}

systemjs加载库的方式的这一小变化解决了我的问题。



2

对于Angular 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

并重新运行解决了我的问题。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.