2

尝试在 git bash 中运行时遇到此问题。.switchMap 未执行并显示错误为“错误 TS2339:属性 'switchMap' 在类型 'Observable' 上不存在”

我正在使用的代码是:

import { User } from './../classes/user';
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { Observable, of } from 'rxjs';
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestore, AngularFirestoreDocument } from '@angular/fire/firestore';
import { from } from 'rxjs';
@Injectable()
export class AuthService {

  public currentUser: Observable<User | null>;

  constructor(
    private router: Router,
    private alertService: AlertService,
    private afAuth: AngularFireAuth,
    private db: AngularFirestore
  ) {

    this.currentUser = this.afAuth.authState
      .switchMap((user) => {
        if (user) {
          return this.db.doc<User>(`users/${user.uid}`).valueChanges();
        } else {
          return of(null);
        }
      });
  }

我的 rxjs 版本是 rxjs@6.3.3 最新版本,nodejs 版本是 v8.12.0 请帮助我建立一个聊天网站。

4

2 回答 2

3

您的问题是,在 RxJs 6 中switchMap(以及许多其他运算符)不再存在于 Observable 上。相反,您必须使用运算符来管道可观察对象,该.pipe()运算符采用任意数量的方法并将它们应用于可观察对象。然后,您导入该switchMap函数以在管道中使用它。

import { switchMap } from 'rxjs/operators';

....

this.currentUser = this.afAuth.authState.pipe(
  switchMap((user) => {
    if (user) {
      return this.db.doc<User>(`users/${user.uid}`).valueChanges();
    } else {
      return of(null);
    })
);

如果您习惯了旧的 (RxJs 5) 行为并且希望以这种方式工作,那么有一个名为rxjs-compat(install it with npm install rxjs-compat) 的包,它允许您使用旧语法的 RxJs 6+。

但是,使用较新的语法会带来很大的性能和包大小增益,因为它支持 Tree Shaking,所以我不推荐它。

于 2019-03-17T05:52:44.037 回答
0

我知道这是一个非常晚的响应,但我遇到了类似的错误。对我来说,即使@Daniel 的答案也不起作用。我不得不在单独的语句中使用管道:

...
this.currentUser = this.afAuth.authState;
this.currentUser.pipe(switchMap(user => {
    if (user) {
      // logged in, get custom user from Firestore
      return this.afs.doc<User>(`users/${user.uid}`).valueChanges()
    } else {
      // logged out, null
      return of(null)
    }
}))

除此之外,我在导入和时遇到了一些麻烦switchmap,但设法将所有内容导入:ofObservable

import { Observable } from 'rxjs';
import { of } from 'rxjs';
import {switchMap} from 'rxjs/operators';

代码在

  • 角 CLI:7.3.8
  • 节点 10.15.3
  • 角 7.2.14
  • rxjs:6.5.1
于 2019-05-16T21:12:25.827 回答