【问题标题】:What should I use instead of toPromise() when using await on an Observable?在 Observable 上使用 await 时,我应该使用什么来代替 toPromise()?
【发布时间】:2019-01-11 15:06:13
【问题描述】:

This page"toPromise has been deprecated! (RxJS 5.5+)" 但我最近一直在使用它与 AngularFire2(当我只想要一个结果时)这样:

const foo = await this.afs.doc(`docPath`).valueChanges().toPromise();

我不应该这样做吗?如果不是,await 替代方案是什么?

更新:

在下面的答案之后我改变了这个:

const foo = await this.afs.doc(`docPath`).valueChanges().toPromise();

...到这个:

const foo = await (new Promise(resolve => this.afs.doc(`docPath`).valueChanges().pipe(first()).subscribe(result => resolve(result))));

有人可以向我解释一下这是如何改进的吗?!对我来说似乎是倒退了一步。

【问题讨论】:

  • @zero298 不要因为toPromise 出现在两个问题中就欺骗投票...
  • @JonasW。你读过副本吗? “toPromise:现在作为 Observable 上的永久方法存在”我认为这意味着它没有被弃用。您是希望我发布一个回答说“它没有被弃用”还是链接到一个说同样多的问题?
  • @zero298 问题是 1 岁吗?

标签: javascript angular promise rxjs angularfire2


【解决方案1】:

你应该放在管道后面!

   .pipe(take(1)).toPromise

【讨论】:

【解决方案2】:

对于那些想发疯的人来说,还有其他一些选择:

const foo = await this.afs.doc(`docPath`).valueChanges().pipe(take(1)).toPromise();

const foo = (await this.afs.doc('docPath').get().toPromise()).data();

const foo = (await this.afs.doc('docPath').get().pipe(take(1)).toPromise()).data();

const foo =  (await this.afs.doc('docPath').snapshotChanges().pipe(take(1))
.toPromise()).payload.data();

但最短的是:

const foo = (await this.afs.doc('docPath').ref.get()).data();

如果您想发出错误,您可以在任何可以使用take(1) 的地方使用first()

有关 Firebase 的更多承诺,请参阅here

J

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 2010-12-06
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多