【问题标题】:Service constructor called twice服务构造函数调用了两次
【发布时间】:2019-05-09 18:19:27
【问题描述】:

我有以下服务:

@Injectable({
  providedIn: 'root'
})

export class AuthService {

  user: Observable<User>;
  checkEmailInterval: any;

  constructor(
    private afAuth: AngularFireAuth,
    private afStore: AngularFirestore,
    private router: Router
  ) {
    this.user = this.afAuth.authState.pipe(
      switchMap(user => {
        if (user) {
          console.log(user);
          if (!user.emailVerified) {
            console.log(this.checkEmailInterval);
            clearInterval(this.checkEmailInterval);
            this.checkEmailInterval = setInterval(this.checkEmailVerified.bind(this), 5000);
          }
          return this.afStore.doc<User>(`users/${user.uid}`).valueChanges();
        }
        else {
          console.log("NO USER");
          return of(null);
        }
      })
    );
  }

每当我打开应用程序时,它的构造函数都会被调用两次。这是预期的行为吗?我想也许它正在为注入的每个组件调用构造函数,但我在 3 个组件中使用该服务。

除此之外,我真的不确定要分享我的代码的哪一部分。有什么想法吗?

【问题讨论】:

  • 看看this answer
  • @ConnorsFan 我见过那个。实际上,我的核心模块中也有该服务,但我删除了它,它什么也没做。
  • AuthService 是否出现在您项目的任何providers 列表中?
  • @ConnorsFan 我刚刚又经历了一遍,但在任何地方都找不到。
  • 对于其他人在这里结束。检查循环依赖。我将我的服务注入到另一个服务中,导致它构建了两次。

标签: angular


【解决方案1】:

您可以尝试在 ngOnInit 中移动此逻辑。根据角度,所有使用 providedIn 属性作为“根”的可注入服务都将被视为单例类,并且将被实例化一次。

@Injectable({
  providedIn: 'root'
})

export class AuthService implements OnInit {

  user: Observable<User>;
  checkEmailInterval: any;

  constructor(
    private afAuth: AngularFireAuth,
    private afStore: AngularFirestore,
    private router: Router
  ) {}

  ngOnInit(){
    this.user = this.afAuth.authState.pipe(
      switchMap(user => {
        if (user) {
          console.log(user);
          if (!user.emailVerified) {
            console.log(this.checkEmailInterval);
            clearInterval(this.checkEmailInterval);
            this.checkEmailInterval = setInterval(this.checkEmailVerified.bind(this), 5000);
          }
          return this.afStore.doc<User>(`users/${user.uid}`).valueChanges();
        }
        else {
          console.log("NO USER");
          return of(null);
        }
      })
    );
  }
}

【讨论】:

  • 这不能回答问题,此外,服务没有 ngOnInit 钩子 afaik
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2016-10-02
相关资源
最近更新 更多