如果数据库调用依赖于this.user,我该如何编写以下代码?

时间:2018-04-04 17:24:59

标签: angular rxjs observable google-cloud-firestore

我订阅了this.userService.current,但有时可能需要一些时间才能从数据库中检索,所以当调用数据库来检索加载时我会测试用户是否是运营商,它会在this.user.carrier上抛出null。在调用数据库以检索加载集合之前,如何等待this.user解析。

    this.userService.currentUser.subscribe(user=>{
      this.user = user;
    });
    this.status$ = new BehaviorSubject("Active");
    this.loads$ = this.status$.switchMap(status => 
    afs.collection<Load>('loads', ref => { 
      if(this.user.carrier){
        ref.where('carrier','==', this.user.carrier.id)
      } 
      ref.where('status', '==', status)
      return ref
    }).valueChanges());

2 个答案:

答案 0 :(得分:0)

在可观察或承诺完成后需要执行的任何事情都必须使用subscribe或then方法。

this.userService.currentUser.subscribe(user=>{
  this.user = user;
  this.status$ = new BehaviorSubject("Active");
  this.loads$ = this.status$.switchMap(status => 
  afs.collection<Load>('loads', ref => { 
  if(this.user.carrier){
    ref.where('carrier','==', this.user.carrier.id)
  } 
  ref.where('status', '==', status)
  return ref
  }).valueChanges());
});

答案 1 :(得分:0)

observable上的订阅的第一个参数是每次来自您的observable的新值时执行的函数。所以这里的重点是在这个函数中做你的东西,而不是像你的例子那样在外面。

看起来像这样:

this.userService.currentUser.subscribe(user=>{
    this.user = user;

    this.status$ = new BehaviorSubject("Active");
    this.loads$ = this.status$.switchMap(status => 
        afs.collection<Load>('loads', ref => { 
        if(this.user.carrier){
           ref.where('carrier','==', this.user.carrier.id)
        } 
        ref.where('status', '==', status)
        return ref
    }).valueChanges());
});