Switchmap继续出现TypeError

时间:2019-04-15 14:58:42

标签: angular firebase rxjs

我正在尝试创建一个从Firestore登录Promise返回UserEntity的Observable。 我一直收到此消息:

  

错误TypeError:您提供了一个无效对象,其中流是   预期。您可以提供一个Observable,Promise,Array或Iterable。

this.userRepository.getOne(res.user.uid)正常工作(分别测试)。

谁能解释我发生了什么事?

loginObservable(email: string, password: string): Observable<UserEntity> {
return fromPromise(this.afAuth.auth.signInWithEmailAndPassword(email, password))
  .pipe(
    tap(val => console.log(`1 BEFORE MAP: ${val.user.uid}`)),
    catchError(e => {
      console.log("error : " + e.toString());
      throw(e);
    }),
    switchMap(res => {
      console.log(`1 BEFORE MAP: ${res.user.uid}`);
      return this.userRepository.getOne(res.user.uid);
    }),
    catchError(e => {
      console.log("error : " + e.toString());
      throw(e);
    }),
    tap(val => console.log(`2 AFTER MAP: ${val}`))
  );
}

getOne返回一个可观察到的值,可以。

getOne(id: string): Observable<UserEntity> {
  return this.getCollection()
   .doc<UserEntity>(id)
   .get()
   .pipe(
    tap(val => console.log(`BEFORE MAP: ${val}`)),
    map(res => UserEntityAdapter.from(res.id, res.data())),
    tap(val => console.log(`after MAP: ${val}`)),
   );
}

适配器代码:

export class UserEntityAdapter {
 static from(id: string, snapshot: any): UserEntity {
  return {
   id,
   name: snapshot.name,
   firstName: snapshot.firstName,
   phoneNumber: snapshot.phoneNumber,
   gender: snapshot.gender,
   urlPhotoPublic: snapshot.urlPhotoPublic,
 };
}
}

1 个答案:

答案 0 :(得分:0)

根据错误消息的建议,您为'switchMap'提供了一种没有返回类型为Observable,Promise,Array或Iterable的方法。因此,您需要将“ switchMap”更改为“ map”,或者从“ getOne()”方法返回Observable,Promise,Array或Iterable。