【问题标题】:Any downside converting Observables to promises将 Observable 转换为 Promise 的任何不利因素
【发布时间】:2020-08-25 16:27:51
【问题描述】:

有时需要订阅组件,而不是使用异步管道。

在这种情况下,当 observable 只会发出一个值时,转换为 Promise 是否有任何理由或不利因素?既然我们没有订阅,如果有人不取消订阅,这不是比可能发生内存泄漏更安全吗?

【问题讨论】:

  • 如果你是 observable 只发出一个且只有一个值,那么它将完成,在这种情况下,你不需要取消订阅。您也可以使用“first”运算符获取第一个值,然后取消订阅。
  • 添加到 ssougnez 评论中,如果您的 observable 没有完成,那么您的承诺将无限期挂起,这是另一个警告。在 Promise 中封装 this 并没有任何好处,除非您作为开发人员觉得更舒服,或者某些外部 lib/api 需要它。
  • 如果您谈论的是 http 请求,请参阅 Angular Http - toPromise or subscribe。还有Converting Observable to Promise
  • 但是如果我使用第一个运算符,我仍然需要取消订阅。
  • 当您想在完成之前取消可观察对象时,您只需取消订阅已完成的可观察对象。 toPromise 不会为您取消订阅 observable。它订阅然后等待 observable 完成。使用 first 会导致 observable 完成。因此,关于退订,它与使用 toPromise 没有什么不同。

标签: angular rxjs


【解决方案1】:

我知道的缺点是 toPromise() 在 rxjs 7 中将是 deprecated 并在 rxjs 8 中删除。如果你现在经常使用它,以后需要额外的工作才能迁移。如果你想让你的代码在 6.x 中具有未来证明,现在实现 lastValueFrom 和 firstValueFrom 并使用它们,那么以后更改 rxjs7 中提供的实现并删除这两个方法会很容易。有关它们的用法,请参阅链接文章。

import { Observable } from 'rxjs';
import { first } from 'rxjs/operators';

export function lastValueFrom<T>(obs$: Observable<T>): Promise<T> {
  return obs$.toPromise();
}

export function firstValueFrom<T>(obs$: Observable<T>): Promise<T> {
  return obs$.pipe(first()).toPromise();
}

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2021-12-01
    • 2016-12-25
    • 2018-02-19
    • 2018-08-22
    相关资源
    最近更新 更多