我有一个型号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 ^)/)
答案 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;
}