【问题标题】:rxjs__WEBPACK_IMPORTED_MODULE_1__.Observable.throw is not a functionrxjs__WEBPACK_IMPORTED_MODULE_1__.Observable.throw 不是函数
【发布时间】:2020-01-21 00:12:11
【问题描述】:

我将 Angular 6 与 rxjs^6.0.0 和 rxjs-compat^6.5.2 一起使用,但出现以下我无法解决的错误:

rxjs__WEBPACK_IMPORTED_MODULE_1__.Observable.throw 不是函数

我尝试了以下解决方案,但均未成功:

这是我正在使用的代码:

import { Injectable, Inject } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { BehaviorSubject, throwError } from 'rxjs';
import { Observable } from 'rxjs/Observable';
import { map, tap, mergeMap } from 'rxjs/Operators';
import { Login } from "./login/login";
import { CurrentUser } from "./login/current-user";
import { Registration } from "./registrations/registration";

@Injectable()
export class AuthenticationService {
  private currentUserSubject: BehaviorSubject<CurrentUser>;
  public currentUser: Observable<CurrentUser>;

  constructor(private httpClient: HttpClient,
    @Inject("BASE_API_URL") private baseUrl: string) {
    this.currentUserSubject = new BehaviorSubject<CurrentUser>(JSON.parse(localStorage.getItem('currentUser')));
    this.currentUser = this.currentUserSubject.asObservable();
  }

  public get currentUserValue(): CurrentUser {
    return this.currentUserSubject.value;
  }

  signIn<T>(login: Login) {
    return this.httpClient.post<T>(`${this.baseUrl}api/authentication/login`, login)
      .pipe(mergeMap(loginResult => {
        return this.httpClient.get<Registration>(`${this.baseUrl}api/users/${loginResult.user.id}/registration`)
          .pipe(map(registration => {
            if (registration.registrationStatusId == 1)
              return throwError('Registration is pending approval.');
            else if (registration.registrationStatusId == 3)
              return throwError('Registration has been rejected.');

            let currentUser = new CurrentUser();
            currentUser.identity = registration;
            currentUser.identity.user = loginResult.user;
            currentUser.token = loginResult.token;
            currentUser.refreshToken = loginResult.refreshToken;

            localStorage.setItem('currentUser', JSON.stringify(currentUser));
            this.currentUserSubject.next(currentUser);
          }));
      }));
  }
}

【问题讨论】:

  • 我觉得你错过了你的课程。尝试从 rxjs 导入 Observable 而不是 rxjs/observable(这是 throwError 返回一个新的 observable,但您使用的是应该返回原始值的 map 运算符 - 您可以简单地调用 throw new Error。最后,您也没有在 map 上返回值。

标签: javascript angular typescript rxjs single-page-application


【解决方案1】:

您的导入代码是正确的,但我认为您应该为 rxjs 和 rxjs-compact 使用相同的版本,因此请更新您的 package.json

"rxjs": "^6.5.2",
"rxjs-compat": "^6.5.2"

然后删除 package-lock.json 然后再次运行npm install

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2017-05-06
    • 2019-12-20
    相关资源
    最近更新 更多