【问题标题】:Convert Angularfire2/Firestore observable to promise将 Angularfire2/Firestore observable 转换为 promise
【发布时间】:2018-08-22 22:47:47
【问题描述】:

你能告诉我如何将 Angularfire2/Firestore observable 转换为 promise 吗? 我已经尝试如下所示。但它不起作用,也没有错误。

.ts

  this.categories$ = this.categoryProvider.getAllContactCategories().valueChanges();
   const defaultCategories = await this.categories$.map((response) => response).toPromise();//after this line it won't execute
   await Promise.all(defaultCategories.map(async (c: Category) => {
   await this.categoryProvider.createCategory(c.name, project.id);
      }));

provider.ts

  getAllContactCategories(): AngularFirestoreCollection<Category> {
    return this.fireStore.collection(`contactCategories`);
  }

【问题讨论】:

  • 但是你愿意这样做吗?在打字稿中有不同的异步处理方式。为什么你只需要async await
  • 是的,我需要在这里使用async/await 模式,因为这只是方法的一小部分。我在整个方法中都使用了这种模式。所以这就是原因。 @NamanKheterpal
  • 我无法帮助您回答您的问题,但我只能建议使用这么多 await 是非常糟糕的做法。 Angular 更喜欢 observable 而不是 promises 是有原因的。我可以帮助您仅使用 observable 来实现相同的结果。
  • 是的,在某些用例中,我们需要使用 Promise 而不是 observable。我找到了解决方案。感谢您的反馈:) @NamanKheterpal

标签: angular typescript promise observable google-cloud-firestore


【解决方案1】:

我是这样做的:干杯:)

注意:这只是为了更新master table 的一些默认记录。仅此而已:)

import { first } from 'rxjs/operators';

this.categories$ = this.categoryProvider.getAllContactCategories().valueChanges();
const defaultCategories = await this.categories$.map(categories => {
     categories.forEach(async (c) => {
         await this.categoryProvider.createCategory(c.name, project.id);
      });
   }).pipe(first()).toPromise();

【讨论】:

  • forEach 中使用async/await 是认真的吗?这是你唯一拥有的东西吗?
  • 是的,这对于我的用例@NamanKheterpal 来说绰绰有余
  • 这只是为了更新master table的一些记录。仅此而已。 @NamanKheterpal
  • 有一个 rxJs 命名 .flatMap 的功能,它可以帮助你用 observable 做同样的事情。 :D
  • 我不能在这里使用 observable。我之前提到过原因@NamanKheterpal
猜你喜欢
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 2018-02-19
  • 2016-08-15
  • 2021-09-21
相关资源
最近更新 更多