代码之家  ›  专栏  ›  技术社区  ›  user1836162

如何将可观测值存储在变量或属性中

  •  2
  • user1836162  · 技术社区  · 8 年前

    我一直在使用angular和firebase/firestore进行一个项目。

    我有以下代码:

    this.cadet = this.cadetCollection.valueChanges().subscribe(x => {
      this.cadetName = x[0].Cadet;
      this.cadetCompany = x[0].Company;
      this.cadetId = x[0].CadetId;
      return x as Cadets[];
    }));
    

    我可以将数据记录到控制台,也可以在html模板中通过插值使用数据。然而,我真正需要做的是将数据存储在组件属性或变量中,以便我可以使用一些数据进行计算。

    我对角度和可观察的物体还是相当陌生的,所以请友善:)

    在发表一些评论之后,我尝试了以下几点:

        this.cadets = this.cadetCollection.valueChanges().subscribe(x => {
      this.cadetName = x[0].Cadet;
      this.cadetCompany = x[0].Company;
      this.cadetId = x[0].CadetId;
      this.cadet = x[0];
      console.log(this.cadet);
      return x as Cadets[];
    });
    
    console.log('Cadet is ' + this.cadet);
    

    似乎只要对象位于subscribe方法中,就会将其返回到控制台,但此后未定义该对象。

    5 回复  |  直到 8 年前
        1
  •  2
  •   Vikas RyanSand20    8 年前

    然而,我真正需要做的是将数据存储在 组件属性或变量,以便我可以使用一些数据 用于计算。?

    您正在使用 async programming 您不能暂停代码的执行,您的订阅将在将来得到解决,但无法预测何时解决。您可以做的是将值存储在类属性中,并在subscribe中调用一个方法,以确保该方法仅在填充cadet对象时调用,而不是在此之前。参考 this 为了更好的理解。

    public cadet=[];
    this.cadet = this.cadetCollection.valueChanges().subscribe(x => {
     this.cadet=x;
    this.myMethod(this.cadet);//your logic
    }));
    
        2
  •  1
  •   Kelvin Lai    8 年前

    假设你有 cadet 属性,您可以只指定 x[0] this.cadet :

    this.cadetCollection.valueChanges().subscribe(x => {
      this.cadet = x[0];
    }));
    

    提供新信息后的更新:

    似乎只要对象位于subscribe方法中,就会将其返回到控制台,但此后未定义该对象。

    不完全一样-subscribe块中的代码是异步运行的,所以请多花点时间 console.log('Cadet is ' + this.cadet); 运行时,订阅块尚未执行!

        3
  •  1
  •   RazvanParautiu    6 年前

    您有两种选择:

    1. 分解器: https://angular.io/api/router/Resolve 解析程序将在请求完成后更改状态。
    2. 异步等待: Observable和Promise是异步的,这就是subscribe方法中的变量未定义的原因。使用async Wait,您将能够从局部变量中的subscribe获取数据。
            async myMethod(){
              this.cadet = await this.cadetCollection.valueChanges().subscribe(x => {
              this.cadetName = x[0].Cadet;
              this.cadetCompany = x[0].Company;
              this.cadetId = x[0].CadetId;
              return x as Cadets[];
            }));
            }
    
        4
  •  0
  •   user1836162    8 年前

    之前有一个用户发布了这个答案,但我再也看不到了。

    我所能做的是创建一个在属性中设置值的方法,然后在可观察对象上的subscribe方法中调用该方法。

      this.cadets = this.cadetCollection.valueChanges().subscribe(x => {
      this.cadetName = x[0].Cadet;
      this.cadetCompany = x[0].Company;
      this.cadetId = x[0].CadetId;
      this.cadet = x[0];
      this.setCurrentCadet(x[0]);
      console.log(this.cadet);
      return x as Cadets[];
    });
    

    感谢所有评论和帮助我的人!

        5
  •  -1
  •   fatmali    8 年前

    您可以按照kevin的建议简单地执行此操作:

    public cadet = {} this.cadetCollection.valueChanges().subscribe(x => this.cadet = x ));

    对于学员的进一步操作,您所要做的就是在进行任何计算之前检查学员是否已定义。