После миграции моего приложения с углового 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 / добавить / оператор / publishReplay.js'

Я пробовал импортировать publishReplay из операторов rxjs и rxjs /.

Импортировать {фильтр, карту, catchError, publishReplay} из 'rxjs / operator';

Но проблема все еще сохраняется, есть ли какие-либо изменения для 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;
    }
  }
1
V5NXT 25 Сен 2018 в 10:12

2 ответа

Лучший ответ

Хорошо. Наконец, я обнаружил проблему и решил ее, надеюсь, это поможет кому-то еще, поэтому я публикую ее здесь.

Проблема заключалась в расположении подфункции функции трубы. Поскольку новый 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
V5NXT 26 Сен 2018 в 04:18

Angular 6 обновляет версию RxJS до версии с операторами lettable. Вы не можете больше использовать синтаксис, к которому вы привыкли, если не установите пакет совместимости.

Новый синтаксис выглядит примерно так:

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

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

Пакет совместимости: здесь

Существует также автоматический способ конвертировать ваш исходный код в новый (и IMHO дрянной) синтаксис.

0
kubal5003 25 Сен 2018 в 07:25