Angular 7-对象组合和数组

时间:2019-02-27 10:49:48

标签: angular

我有一个型号Userc(姓名,电话,电子邮件等)。 和另一个模型Usercco(具有相同的附加价值共同名称(公司名称)

在Userc中,我有(coid:“公司ID”) 在DB(firebase)中,我只有Userc和Company

我试图合并所有Userc和Company.coname以获得Userco的列表:

在组件中

  ngOnInit() {
    this.usercService.getAllUserc().then(
      (userc: Userc[]) => {
        this.usercs = userc;

      });

      this.usercco= this.usercService.AddConametoUsercs(this.usercs)
      console.log(this.usercco);

  }

在UsercService中(此方法有效):

 getAllUserc() {
        return new Promise(
            (resolve, reject) => {
                firebase.database().ref('userc/').once('value').then(
                    (data: DataSnapshot) => {
                        resolve(data.val());
                    }, (error) => {
                        reject(error);
                    }
                );
            }
        );
    }

和其他人(无效):

AddConametoUsercs(usercs: Userc[]) {
        var size= usercs.length;
        console.log('Taille : '+size);
        for (let i = 0; i < usercs.length; i++) {
            this.companyService.getCompany(usercs[i].coid).then(
                (company: Company) => {
                    this.company = company;
                    this.usercco[i].coname = this.company.coname;
                }
            );
            this.usercco[i].coid = usercs[i].coid;
            this.usercco[i].usercid = usercs[i].usercid;
            this.usercco[i].usercfname = usercs[i].usercfname;
            this.usercco[i].userclname = usercs[i].userclname;
            this.usercco[i].usercemail = usercs[i].usercemail;
            this.usercco[i].role = usercs[i].role;
        }
        return this.usercco;
    }

如何将Userc数据与Company.coname合并到Usercco中?

我知道长度不起作用,因为它是一个对象而不是数组。然后如何获取每个Userc []项目?没有长度功能。

感谢您的帮助^^ d((^ o ^)/)

1 个答案:

答案 0 :(得分:0)

该问题已经在组件中发生。

 ngOnInit() {
    this.usercService.getAllUserc().then(
      (userc: Userc[]) => {
        this.usercs = userc;

      });

      this.usercco= this.usercService.AddConametoUsercs(this.usercs)
      console.log(this.usercco);

  }

在调用getAllUserc方法之前,您不必等待AddConametoUsercs承诺的解决。在resolve函数中,您正在设置userc的值,但是在解析之前,您正在调用AddConametoUsercs方法。

对此的一个简单解决方法是转到承诺中的usercco分配。

ngOnInit() {
    this.usercService.getAllUserc().then(
      (userc: Userc[]) => {
        this.usercs = userc;

      });

      this.usercco= this.usercService.AddConametoUsercs(this.usercs)
      console.log(this.usercco);

  }

您在用户服务中的AddConametoUsercs遇到了一些问题,对我来说,一个大的危险信号是for循环中使用promises。根据我的理解,您只是希望Userc包含一个companyname属性,该属性恰好位于firebase的另一个位置,并且可以通过getCompany

获取

使用async-await可以很好地解决此问题,但是我敦促您在使用async-await之前更好地理解Promise。不过,这是一个很好的解决方案。

解决方案

首先,我们希望在进行任何合并之前获取所有用户的所有公司名称。我们将通过遍历用户,返回他们的coid并致电getCompany来实现这一点。

// First step
//
AddConametoUsercs(usercs: Userc[]) {
  /** This array will contain all the company ids */
  const companyIds: number[] = usercs.map(userc => userc.coid);
}

在那之后,我们想做类似于Promise.all的循环。这需要一个promise数组作为输入。在这种情况下,getCompany将返回一个承诺数组

AddConametoUsercs(usercs: Userc[]) {
  /** This array will contain all the company ids */
  const companyIds: number[] = usercs.map(userc => userc.coid);
  /** This is an array of promises */
  const companyPromises: Promise<Company>[] = companyIds.map( companyId => this.companyService.getCompany(companyId) );

  const usersWithCompanyNamePromise = Promise.all(companyPromises)
    .then( companies => {
      // companies[0] would match the company with the id matching companyIds[0]
      // which corresponds with the first user in usercs (usercs[0])

     /** We want to loop through our companies, and return a user with the 
      * company name
      */
      const usersWithCompanyName = companies.map( (company, index) => {
        /** 
        * This is the magical part, because the companies were fetched in the 
        * same order as the users
        */
        const correspendingUser = usercs[index];

        const userWithCompanyName = {
          // Using the object spread operator to put the user data here
          ...correspendingUser,
          coname: company.name
        }
        // Returning the new structure, which will end up in usersWithCompanyName
        //
        return userWithCompanyName;
      });

      return usersWithCompanyName;
    });

  return usersWithCompanyNamePromise;
}