如何解决这种循环依赖关系? (如果是这样的话)

时间:2019-12-20 04:18:22

标签: javascript angular typescript firebase

compiler.js:2175 Uncaught Error: Can't resolve all parameters for AuthService: (?, ?, ?, ?).
at syntaxError (compiler.js:2175)
at CompileMetadataResolver._getDependenciesMetadata (compiler.js:20401)
at CompileMetadataResolver._getTypeMetadata (compiler.js:20296)
at CompileMetadataResolver._getInjectableTypeMetadata (compiler.js:20514)
at CompileMetadataResolver.getProviderMetadata (compiler.js:20523)
at compiler.js:20461
at Array.forEach (<anonymous>)
at CompileMetadataResolver._getProvidersMetadata (compiler.js:20421)
at CompileMetadataResolver.getNgModuleMetadata (compiler.js:20148)
at JitCompiler._loadModules (compiler.js:25824)

我收到此错误^^,我很困惑。我是Web开发的新手。根据我所做的研究,它是由循环依赖引起的。我该如何解决?

import { Injectable } from '@angular/core';

@Injectable()
export class AuthService {

  authState: FirebaseAuthState = null;

  public token: any;

  constructor(private af: AngularFire, private db: AngularFireDatabase, private router: Router) {
    af.auth.subscribe((auth) => { this.authState = auth; })
  }

  get authenticated(): boolean {
    return this.authState !== null;
  }

  get currentUser(): any {
    return this.authenticated ? this.authState.auth : null;
  }

  get currentUserId(): string {
    return this.uthenticated ? this.authState.uid : '';
  }

  private socialSignIn(provider: number): firebase.Promise<FirebaseAuthState> {
    return this.af.auth.login({provider, method: AuthMethods.Popup})
      .then(() => this.updateUserData() )
      .catch(error => console.log(error));
  }

  private updateUserData(): void {

      let path = `users/${this.currentUserId}`;
      let data = {
        name: this.currentUser.displayName,
        email: this.currentUser.email,
      }

      this.db.object(path).update(data)
      .catch(error => console.log(error));
  }

  googleLogin(): firebase.Promise<FirebaseAuthState> {
    return this.socialSignIn(AuthProviders.Google);
  }

  signOut(): void {
    this.af.auth.logout();
    this.router.navigate(['/'])
  }
}

我已经看到了很多关于此的帖子,但是所有人都使用注射或类似的方法。我看到的另一件事是人们说要使用其他服务。我该怎么办?

2 个答案:

答案 0 :(得分:0)

您收到此错误消息是因为当angular尝试创建AuthService时,它将搜索您在其构造函数中拥有的所有参数

  constructor(private af: AngularFire, private db: AngularFireDatabase, private router: Router) {

似乎您没有导入AngularFire,AngularFireDatabase,路由器

如果您在执行此操作时也遇到此类错误,请确保注入构造函数的所有类都是@Ingectables

如果这对您也没有帮助,您可以检查此答案https://stackoverflow.com/a/38000323/1037613似乎与之相关

答案 1 :(得分:0)

Angular无法注入您在构造函数中给定的依赖项。手动执行此操作是错误的角度执行方法。

在模块的提供者部分添加您拥有的参数。

@NgModule({
...
providers: [AngularFire, AngularFireDatabase, Router]
...
})

我认为这很有帮助。关于循环依赖,

循环依赖性: 就像您有一个依赖于B的服务,而B服务又依赖于A一样。这称为循环依赖

A-> B-> A