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 - 性能上下文

如何在 Angular 2 beta 的服务中有效地使用 Http 组件?

如何在Angular2中使用Observable通过id查找数组的元素