【问题标题】:Making loops kind of async / wait in JavaScript / TypeScript在 JavaScript / TypeScript 中使循环有点异步 / 等待
【发布时间】:2021-06-01 19:30:40
【问题描述】:

我有一个从(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_rolescompanies 我需要从中获取数据,例如各自的角色名称或公司名称。我通过循环 users 数组并使用 observables 从 Firestore 获取数据来实现它。获取的数据将添加到相应的用户,因此我的 users 数组现在包含有关用户公司名称的信息。

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'];
  });

}

有什么方法可以检测for 循环何时完成,以便我可以显示/隐藏加载微调器?我想过实现一个计数器来检查users 数组的长度,但这似乎不是一种优雅的方式。

我不必通过使用 rxjs 或类似的方法来解决,欢迎每个可行的解决方案或提示。也许一些异步的东西?没找到合适的。

提前谢谢你!

【问题讨论】:

  • 如果你在 async 中调用它的函数,你可以 await 所有异步操作并显示加载微调器/通知
  • for循环中的哪一部分操作是异步的?如果顺序不重要,您可以简单地将 Promise 推送到数组中,然后执行 Promise.all()

标签: javascript arrays typescript asynchronous google-cloud-firestore


【解决方案1】:

希望我理解正确。这是你要找的吗?

let users = [
  { name: 'max', role: 1, company_id: 14 },
  { name: 'steve', role: 3, company_id: 29 },
  { name: 'anna', role: 5, company_id: 124 }
];

for (let [i, user] of users.entries()) {

  // Define all observables
  // ...
  
  // Join observables to one stream
  // ...

  // Subscribe to that joined stream and fetch info
  // ...
  
  if (i+1 === users.length) {
    console.log('Finished!');
  }
}

【讨论】:

  • 是的,这就是我所说的计数器。但我想知道是否有一些异步/等待技术或类似的技术来防止计算东西。无论如何,谢谢,+1 为一个可行的解决方案!
  • 正如 Terry 上面所说,您可以使用 Promise.all(); 创建一个解决方案,但我想不出任何其他解决方案比检查索引与数组长度更优雅。很高兴无论如何我都能表达我的想法!
猜你喜欢
  • 1970-01-01
  • 2021-04-15
  • 2018-09-25
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多