【问题标题】:Observable.of is not a functionObservable.of 不是函数
【发布时间】:2016-08-02 18:39:47
【问题描述】:

我在项目中导入 Observable.of 函数时遇到问题。我的 Intellij 可以看到一切。在我的代码中,我有:

import {Observable} from 'rxjs/Observable';

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

return Observable.of(res);

有什么想法吗?

【问题讨论】:

标签: angular rxjs


【解决方案1】:

如果有人在使用 Angular >= 6 和 rxjs 版本 6 或更高版本时遇到此问题,请在此处查看答案: Could not use Observable.of in RxJs 6 and Angular 6

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

import { of } from 'rxjs';

然后不是调用

Observable.of(res);

随便用

of(res);

【讨论】:

  • 谢谢!由于 api 的波动性,弄清楚 Rx 中的导入对我来说总是一个巨大的挫败感。
  • 最后。花了一个小时经历不同的排列,直到这个答案最终解决了这个问题。他们为什么把这件事弄得这么难?
【解决方案2】:

对于我(Angular 5 和 RxJS 5)建议自动完成导入:

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

虽然应该是(所有静态运算符 fromof 等都可以正常工作:

import { Observable } from 'rxjs/Observable';

【讨论】:

    【解决方案3】:

    我正在使用 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 中移动/更改 of() 功能

    【讨论】:

      【解决方案4】:

      rxjs v6 中,of 运算符应导入为import { of } from 'rxjs';

      【讨论】:

        【解决方案5】:
        import 'rxjs/add/observable/of';
        

        显示 rxjs-compat 的要求

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

        我没有安装这个。由

        安装
        npm install rxjs-compat --save-dev
        

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

        【讨论】:

          【解决方案6】:

          RxJS 6

          当升级到 RxJS 库的第 6 版并且不使用 rxjs-compat 包时,以下代码

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

          必须改成

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

          【讨论】:

            【解决方案7】:

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

            您必须更改导入和实例化。 Check out Damien's blog post

            Tl;博士:

            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);
                });
            

            【讨论】:

            • 使用 6.0,尝试订阅 Observable.create(of(val)) 导致“this._subscribe is not a function”。相反,我通过调用“of(val)”成功地创建了一个 observable。
            【解决方案8】:

            不知何故,甚至 Webstorm 也变成了这样 import {of} from 'rxjs/observable/of'; 一切都开始工作了

            【讨论】:

              【解决方案9】:
              // "rxjs": "^5.5.10"
              import { of } from 'rxjs/observable/of';
              
              .... 
              return of(res)
              

              【讨论】:

              • 这是一个纯代码的答案。您能解释一下您要提出的建议吗?
              • 您好,由于性能问题,我们应该只导入我们需要的运算符,而不是整个“Observable”。在新版本(^5.5.10)中,导入“of”运算符的正确方法是: import { of } from 'rxjs/observable/of' ...它适用于我的情况。我将编辑我的决议。谢谢彼得。
              【解决方案10】:

              这应该可以正常工作,试试吧。

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

              【讨论】:

                【解决方案11】:

                对于 Angular 5+:

                import { Observable } from 'rxjs/Observable';应该可以工作。观察者包也应该匹配导入 import { Observer } from 'rxjs/Observer'; 如果你使用的观察者是

                import {&lt;something&gt;} from 'rxjs'; 进行大量导入,因此最好避免它。

                【讨论】:

                  【解决方案12】:

                  我的愚蠢错误是我在需要 observable 时忘记添加 /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 指出的那样,不知何故这不起作用。我确实同意了他的建议
                  【解决方案13】:

                  无论出于何种原因,修补对我不起作用,所以我不得不求助于这种方法:

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

                  【讨论】:

                  【解决方案14】:

                  我今天遇到了这个问题。我正在使用 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 加载库的方式的这个小改变解决了我的问题。

                  【讨论】:

                  【解决方案15】:

                  只是补充,

                  如果您使用其中的许多,那么您可以使用

                  导入所有
                  import 'rxjs/Rx'; 
                  

                  如@Thierry Templier 所述。但我认为如果您使用的是有限运算符,那么您应该导入单个运算符,例如

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

                  如@uksz 所述。

                  因为 'rxjs/Rx' 将导入所有 Rx 组件,这绝对是性价比。

                  【讨论】:

                  • 我发现我不需要在一个角度项目中使用这个语句。但在另一个中,我必须导入它。我不明白这些差异。你知道原因吗?
                  【解决方案16】:

                  虽然听起来很奇怪,但对我来说,在import {Observable} from 'rxjs/Observable 的导入路径中将“O”大写很重要。如果我从 rxjs/observable 导入 Observable,带有 observable_1.Observable.of is not a function 的错误消息仍然存在。奇怪,但我希望它对其他人有所帮助。

                  【讨论】:

                    【解决方案17】:

                    您也可以通过这种方式导入所有运算符:

                    import {Observable} from 'rxjs/Rx';
                    

                    【讨论】:

                    • 我不建议以这种方式导入,因为这是一个很大的库,而“of”只是其中很小的一部分。
                    • @methgaard import { Observable } from 'rxjs/Observable' import 'rxjs/add/observable/of'; 不起作用。只有import {Observable} from 'rxjs/Rx'; 有效。版本是5.4.2
                    • @methgaard 对不起。我犯了一个错误。事实是我得到了Observable_1.Observable.of(...).delay(...).timeout is not a function。我没有使用import 'rxjs/add/operator/timeout'
                    • 它还会增加捆绑包的大小
                    【解决方案18】:

                    实际上我的导入搞砸了。在最新版本的 RxJS 中,我们可以这样导入它:

                    import 'rxjs/add/observable/of';
                    

                    【讨论】:

                    • 在我第 192 次重复拍摄后,我注意到在我的代码中我是从 operator/ - rxjs/add/operator/of - 而不是 observable/ 导入的。哦。
                    • 我发现我不需要在一个角度项目中使用这个语句。但在另一个中,我必须导入它。我不明白这些差异。你知道原因吗?
                    • Angular 版本,也许?!我不必为 4.3.2 执行此操作,但我为 5.0.0 执行了此操作。
                    • @Draghon:和我一模一样。我不必为 4.4 做这件事,我现在为 5.2 做。更奇怪的是,我只需要将它包含在一个文件中,所有其他 .ts 文件只需将其拾取即可。
                    • 如果我找不到模块“rxjs/add/observable/of”怎么办?
                    猜你喜欢
                    • 1970-01-01
                    • 2017-03-24
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-10-17
                    • 2017-05-06
                    • 2019-12-20
                    • 1970-01-01
                    相关资源
                    最近更新 更多