何时在Angular中使用Observables和Promises

问题描述 投票:3回答:3

在从一个基于Promise的大型应用程序中读了很多关于Observables之后,我了解它们利用流/事件模式的能力,但是,我觉得有时使用Observables感觉笨重和矫枉过正。

当您想要获取某些数据时,特别是对于分页数据,Observable是完美的。您可以为分页连接初始大小和偏移量,并对页面和大小进行更新,触发对observable的更新,并获取更多数据,转换它等。

但是,当我们做一些简单的事情,比如对/api/books/123的DELETE请求,并且没有有价值的响应时,使用Observables就像没有“观察”一样感觉很尴尬,你必须通过订阅来“触发”请求。 。

下面是一个例子:

诺言

await myService.DeleteBook('123');
// the book is now deleted

可观察

myService.DeleteBook('123')
// the book is still there as the request isn't sent yet
.subscribe(x => {
   // finally in here the book is deleted, but 'x'
   // is pretty much worthless so this method pretty much does nothing.
});

所以我想到了一些事情:

  1. 订阅DELETE请求感觉很尴尬
  2. 这是额外的代码,基本上没有任何好处
  3. 我喜欢如何通过简单地添加/删除行中的await来控制是否阻止Promise

我在Observables周围看到的所有博主和文章似乎都专注于一直使用Observables,从不使用Promises。

This guy似乎是唯一一个对Observables“站立”的人,并试图争论为什么他们只应在他们有意义的时候使用,但所有的评论都是人们只是抨击他并说Observables仍然是银弹。

有人可以向我解释为什么在所有情况下都会对使用Observable有如此强烈的立场态度吗?

angular rxjs
3个回答
2
投票
myService.DeleteBook('123')
// the book is still there as the request isn't sent yet
.subscribe(x => {
   // finally in here the book is deleted, but 'x'
   // is pretty much worthless so this method pretty much does nothing.
});
  • “x”并非完全无价值。您仍然希望检查响应并相应地显示成功消息,或者在错误回调中处理HTTP错误。对?使用promises,您必须将其包装到try / catch中以处理HTTP错误。
  • 关于可观察量的另一个最好的事情是它们可以与其他可观察物结合并被链接。如果你看看RXJS操作员,你可以用它们做一些非常酷的东西。操作员可以使用observable来玩乐。
  • 例如,在您的情况下,想象在删除之前需要显示警告对话框。您可以将带有warning observable的delete observable与filter运算符一起链接,只有在用户单击“Yes”时才删除。如果您使用可观察量而不是承诺,这将更容易实现。
  • 同样出于一致性原因,您希望在任何地方保持相同的订阅模式。比如,你不想在一个地方使用Promise而在其他地方使用observable来混淆其他开发者。

0
投票

可观察量比你提到的要多得多。虽然所有这些因素都很重要,但它们不是关于流媒体,不是关于事件处理,甚至不是关于组合。 Observable<T>T的超级大国:一旦你得到它,你就无法回头。蜘蛛侠永远不会成为彼得帕克尔。特别是,这意味着你“提升”你的常规代码,从而赋予它很好的能力...... rx所做的所有令人敬畏的事情。

理解rx的最好方法是将其视为一个通用函数 - 随着时间的推移,它可以执行无限多的return语句。试图摆脱那种靠近功能本身摆脱的那种。您不必试图摆脱它,而是必须尝试将解决方案融入其中,就像您根据特定签名的某些功能或甚至裸露导出的函数来定义您的抽象解决方案一样。在少数情况下,它要求您将一些不可观察(如承诺)的东西映射到语义上相同的可观察量(from(...)就可以)。因此,您必须毫无疑问地自由使用这些映射器。

如果需要更详细的解释,请与我们联系。


-1
投票

我倾向于同意你的意见,尤其是对于这里的用例,甚至GET也是如此。对于Angular我喜欢.toPromise()

let book = await httpObservableService.GetBook('123').toPromise()
© www.soinside.com 2019 - 2024. All rights reserved.