Angular2中Http的Promise vs Observable? [复制]
Posted
技术标签:
【中文标题】Angular2中Http的Promise vs Observable? [复制]【英文标题】:Promise vs Observable for Http in Angular2? [duplicate] 【发布时间】:2017-03-15 19:39:59 【问题描述】:基本上,正如标题所说,是否有任何理由使用observable over a promise 来进行http 调用?似乎不必要的过度复杂化,因为所有调用都会成功或失败,并且几乎没有真正的理由取消它。询问典型的用例,而不是典型的可观察到的 debounce 销售宣传(具有讽刺意味的是,ng-debounce 无论如何都做得很好,不会进行无用的调用)。
【问题讨论】:
当我们有更多订阅者时,不要忘记重复的 http 调用 - 可以加热 observable,这意味着更多样板。 最明显的原因是 Http 使用 observables 而不是 promises。这是最省力的路径。 groups.google.com/forum/#!topic/angular-data-dev/AdULPprCkbI 你可以使用带有异步函数的 Promise,observables 有望很快得到Symbol.toAsyncIterator
并允许for... await
处理它们,但这可能需要一段时间。
【参考方案1】:
observables 的巨大优势在这里非常重要。
Observable
支持取消,而Promise
不支持。
使用subscribe()
和map()
,而不是then()
似乎不会给我增加太多复杂性。
如果需要,您也可以使用toPromise()
获取Promise
。
更多详情请参见Angular - Promise vs Observable。
此外,如果使用 FRP 编程风格,则可以方便地在任何地方获得可观察的。如果不希望这样做,只需使用 toPromise()
即可提供 Promise
和稍微简单的 API。
【讨论】:
同意,但是一旦您订阅了流,您就不能链接任何异步函数来在解析后添加行为。在我看来,observable 并不是 http 调用的最佳选择,当一个简单的 Promise 就足够并且可以链接起来时,它们会导致创建样板。 只需使用map()
而不是subscribe()
。你也可以使用toPromise()
,然后你会得到then()
。使用 observables 您可以获得一切,而使用 Promise
您只能获得没有显着好处的部分(恕我直言)。
通过retrying 失败的请求建立一些弹性也容易得多。
@GünterZöchbauer 如果您调用 toPromise,为什么不直接使用 Promise?
承诺,至少来自合理的库是可以取消的。更不用说 Promise 在 Angular 1 中具有取消意识。【参考方案2】:
promise 和 observable 之间最基本的区别是,如果没有订阅功能,Observable 模块将无法工作。从而减轻您服务器的负担。
在 Promise 中,无论您是否真正使用响应,在使用您的请求和有效负载 ping 您的服务器后,它都会向您发送一个 Promise 对象;这有时是不可取的。
基础是减少节点或其他服务器的负载。
【讨论】:
在什么情况下,您会在不使用响应的情况下设置角度 http 调用?这对我来说没有任何意义。我了解延迟加载,但不了解它在这里的适用性。不想变得粗鲁,只是真的不明白为什么人们会将此作为论点。 这并不意味着请求将被发送但响应被忽略。你可以有一系列不同的方法来构建一个可观察的map()
、filter()
、replay()
、flatMap()
等等,但你可能出于某种原因决定,你不想在全部或有时在满足某些条件时。这就像一个 SQL 查询,您可以提前准备和构建,并且只按需发送或重复发送。
如果两个不同的客户订阅了它 - 它会工作两次,它会推迟调用,直到你真正需要它。以上是关于Angular2中Http的Promise vs Observable? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
带有 Angular2 和 VS 2015 的 Webpack
RxJS Observables 的 Promise.all 行为?
在Angular 2中拒绝Promise时未处理的Promise拒绝[重复]
Angular 5 - Promise vs Observable - 性能上下文