在JavaScript/TypeScript中使循环有点异步/等待
我有一个从(Firestore)数据库获取的用户对象数组,看起来类似于:在JavaScript/TypeScript中使循环有点异步/等待,javascript,arrays,typescript,asynchronous,google-cloud-firestore,Javascript,Arrays,Typescript,Asynchronous,Google Cloud Firestore,我有一个从(Firestore)数据库获取的用户对象数组,看起来类似于: let users = [ { name: 'max', role: 1, company_id: 14 }, { name: 'steve', role: 3, company_id: 29 }, { name: 'anna', role: 5, company_id: 124 } ]; 有两个表user\u roles和companys,我需要从中获取相应的角色名称或公司名称等数据。我通过在用户数组中循环
let users = [
{ name: 'max', role: 1, company_id: 14 },
{ name: 'steve', role: 3, company_id: 29 },
{ name: 'anna', role: 5, company_id: 124 }
];
有两个表user\u roles
和companys
,我需要从中获取相应的角色名称或公司名称等数据。我通过在用户
数组中循环,并使用可观察对象从Firestore获取数据来实现它。提取的数据被添加到相应的用户中,因此myusers
数组现在包含有关用户公司名称的信息
for (let user of users) {
// Define all observables
const role_data = firebase.getRoleData(user.role);
const company_data = firebase.getCompanyData(user.company_id);
// Join observables to one stream
const join_stream = combineLatest([role_data, company_data]);
// Subscribe to that joined stream and fetch info
join_stream.subscribe(([role_data, company_data]) => {
user.role_name = role_data['role_name'];
user.company_name = company_data['company_name'];
});
}
是否有任何方法可以检测何时完成的循环,以便显示/隐藏加载微调器?我曾想过实现一个计数器来检查用户
数组的长度,但这似乎不是一个优雅的方法
我不必使用rxjs或类似的工具来解决这个问题,任何可行的解决方案或提示都是受欢迎的。也许是一些异步的东西?我还没有找到合适的
提前谢谢你 希望我理解正确。这就是你要找的吗
让用户=[
{name:'max',角色:1,公司id:14},
{姓名:'steve',角色:3,公司id:29},
{姓名:'anna',角色:5,公司id:124}
];
for(让[i,user]的users.entries(){
//定义所有可见项
// ...
//将可观察对象连接到一个流
// ...
//订阅加入的流并获取信息
// ...
if(i+1==users.length){
console.log('Finished!');
}
}
让我知道它是否有效如果您在异步
中调用函数,您可以等待
所有异步操作并显示加载微调器/注意for
循环中的操作的哪一部分是异步的?如果顺序不重要,您可以简单地将承诺推入一个数组,然后执行Promise.all()
。是的,这是我所说的相反的事情。但我想知道是否有一些异步/等待技术或类似的技术来防止计数。无论如何,感谢+1提供了一个有效的解决方案!如上所述,您可以使用Promise.all()创建一个解决方案代码>,但我想不出任何其他解决方案比对照数组长度检查索引更优雅。很高兴我能不顾一切地表达我的想法!