RXJS 6.0:./node_modules/rxjs-compat/_esm5/add/operator/publishReplay.js中的错误

时间:2018-09-25 07:12:57

标签: angular rxjs migration angular6 rxjs6

将我的应用程序从5号角迁移到6号角后,rxjs引起了各种各样的问题。我在迁移过程中以及删除它后都使用了rxjs-compact,因为它会导致更大的内存利用率。我被留下这样的错误。

  

./ node_modules / rxjs-compat / _esm5 / add / operator / publishReplay.js中的错误   模块构建失败:错误:ENOENT:没有此类文件或目录,请打开“ /home/training/Desktop/vishnu/TemplateAppv6/node_modules/rxjs-compat/_esm5/add/operator/publishReplay.js”

我尝试从rxjs和rxjs / operators导入publishReplay。

从“ rxjs / operators”导入{过滤器,地图,catchError,publishReplay};

但是问题仍然存在,publishReplay是否有任何变化,例如catchError。

任何帮助将不胜感激。

这是完整的代码

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
import { Observable } from 'rxjs';

import { ErrorResponse } from '../core/interfaces/Error';

import { throwError, ReplaySubject } from 'rxjs';
import { filter, map, catchError, publishReplay } from 'rxjs/operators';

import 'rxjs/add/observable/forkJoin';

import { environment } from '../../environments/environment';
import { HomeConstants } from './home-consatant';
import { BaseService } from '../core/base.service';




                // Construct the rail data.
                responses.map((response: RailResponse) => {
                  railsData[response.railId] = response
                    .entries
                    .map((entry: EntriesEntity) => {
                      return {
                        imageSrc: this.getImageUrl(entry, response.railId), // Get rail image according to the rail type.
                        contentTypeLabel: entry.pricingType, // Content Type.
                        description: entry.title, // Rail title.
                        url: '/details/' + entry.programType + '/' +
                          this.utility.encodeProgramName(entry.title) + '/' + entry.id, // Rail url.
                        isPopoverVisible: true,
                        popoverTitle: entry.title,
                        popoverDescription: entry.title
                      };
                    });
                });
                return railsData;
              })
              .publishReplay(1, this.cacheInterval)
              .refCount()
              .take(1)
              .catchError((res: HttpErrorResponse) => throwError(res));
            this.rails.set(railParams[0].railId, this.railResponse);
          }
          return this.rails.get(railParams[0].railId);
        }
      } else {
        return null;
      }
    } else {
      return null;
    }
  }

2 个答案:

答案 0 :(得分:1)

好,最后我找到了问题并解决了,希望对其他人有所帮助,所以我将其发布在这里。

问题在于管道功能的子功能的布置。由于新的rxjs仅支持管道方法,因此我们过去使用'。'赋予映射功能的每个子功能。我们必须在子功能中加上','。

.map((entry: EntriesEntity) => {
                      return {
                        imageSrc: this.getImageUrl(entry, response.railId), // Get rail image according to the rail type.
                        contentTypeLabel: entry.pricingType, // Content Type.
                        description: entry.title, // Rail title.
                        url: '/details/' + entry.programType + '/' +
                          this.utility.encodeProgramName(entry.title) + '/' + entry.id, // Rail url.
                        isPopoverVisible: true,
                        popoverTitle: entry.title,
                        popoverDescription: entry.title
                      };
                    });
                });
                return railsData;
              })
              .publishReplay(1, this.cacheInterval)
              .refCount()
              .take(1)
              .catchError((res: HttpErrorResponse) => throwError(res));
            this.rails.set(railParams[0].railId, this.railResponse);
          }

将其更改为..

 .pipe(map((response: GetRailsResponse) => {
        return response;
      }),
      publishReplay(1, this.cacheInterval),
      refCount(),
      take(1),
      catchError((res: HttpErrorResponse)=> { 
        return throwError(res)
        })
      );


      this.rails.set(JSON.stringify(requestBody), this.railsRes);
    }

答案 1 :(得分:0)

Angular 6将RxJS的版本升级为具有可操作的运算符的版本。除非安装了兼容性软件包,否则您将无法再使用以前的语法。

新语法如下:

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

let squares: Observable<number> = of(1, 2).pipe(
  map(m => m * m)
);

兼容性软件包:here

还有一种将您的源代码转换为新的语法的自动方法。