Ошибка, связанная с обновлением rxjs до 6, switchMap не является функцией

 return auth.refreshToken().switchMap((token) => {
                if (token) {

                    return next.handle(this.addToken(req));
                }

                // If we don't get a new token, logout.
                auth.logoutUser(0);
                return empty;

            }).catch((e: any) => {
                // If there is an exception calling 'refreshToken', logout.
                auth.logoutUser(0);
                return empty;
            }).finally(() => {
                this.isRefreshingToken = true;
            });

Это отлично работало с Angular.

"rxjs": "^5.4.3", "@angular/common": "^5.0.3",

После обновления

"@angular/common": "^6.0.3", "rxjs": "^6.0.0"

Я получаю ошибку времени выполнения

"ApiService::handleError TypeError: auth.refreshToken(...).switchMap is not a function
".

При поиске выяснилось, что решение состоит в том, чтобы добавить канал, поэтому добавил

 return auth.refreshToken().pipe(switchMap((token) => {
                if (token) {

                    return next.handle(this.addToken(req));
                }

                // If we don't get a new token, logout.
                auth.logoutUser(0);
                return empty;

            }).catch((e: any) => {
                // If there is an exception calling 'refreshToken', logout.
                auth.logoutUser(0);
                return empty;
            }).finally(() => {
                this.isRefreshingToken = true;
            });

Но он выдает новую ошибку времени компиляции

Argument of type '(token: {}) => Observable<HttpEvent<any>> | ((scheduler?: SchedulerLike) => Observable<never>)' is not assignable to parameter of type '(value: {}, index: number) => ObservableInput<HttpEvent<any>>'."

Похоже, проблема с обновлением rxjs, что можно исправить?

Модифицированный импорт из,

import { switchMap } from "rxjs/operators"; to 
import 'rxjs/add/operator/switchMap'; 

Теперь он выдает ошибку в следующем разделе кода "ошибка TS2304: не удается найти имя "switchMap"".

 return this.tokenSubject.pipe(
                filter(token => token != null),
                take(1),
                switchMap(token => {
                    return next.handle(this.addToken(req));
                })
            );

person user630209    schedule 09.07.2018    source источник
comment
Выдает новую ошибку при изменении импорта из import { switchMap } из rxjs/operators; импортировать 'rxjs/add/operator/switchMap';.. обновлено в вопросе   -  person user630209    schedule 09.07.2018
comment
Вы выполнили все шаги, перечисленные на update.angular.io, при обновлении angular?   -  person Capricorn    schedule 09.07.2018
comment
@Козерог да пытался   -  person user630209    schedule 11.07.2018


Ответы (1)


Быстрое решение — установить rxjs-compat, и ваш старый код не потребует никаких изменений. Однако Rxjs 6 является более стабильной версией для функций, представленных в 5-й версии. Поэтому рекомендуем вам вернуться к документации и перенести импорт и использование rxjs на Rxjs 6.

npm install --save rxjs-compat
person Taha Zgued    schedule 09.07.2018