Promise vs Observable for Http in Angular2?
从本质上讲,标题所说的是,为了进行http调用,是否有任何理由使用可观察量而不是承诺? 看起来像不必要的过度复杂,因为所有的调用都会成功或失败,并且几乎没有真正的理由取消它。 要求这是典型的用例,而不是典型的可观察性销售 - 去抖动(具有讽刺意味的是,无论如何,ng-debounce确实很好,而不会进行无用的调用)。
-
当我们有更多的订阅者时,不要忘记重复的http调用 - 一个可以加热可观察量,这意味着更多的样板。
-
最明显的原因是Http使用了可观察而非承诺。 这是努力最少的道路。
-
groups.google.com/forum/#!topic/angular-data-dev/AdULPprCkbI
-
你可以使用带有异步函数的promises,observables希望很快得到Symbol.toAsyncIterator并允许for... await覆盖它们,但这可能需要一段时间。
可观察量的巨大优势在这里非常重要。
Observable支持取消,而Promise则不支持。
使用subscribe()和map()代替then()似乎并没有给我增加太多的复杂性。
如果您需要,也可以使用toPromise()获取Promise。
有关更多详细信息,另请参阅Angular - Promise vs Observable。
此外,如果使用FRP风格的编程,它可以方便地在任何地方获得可观察性。如果不希望这样,只需使用toPromise()就可以得到一个Promise和更简单的API。
-
同意,但是一旦您订阅了流,您就无法链接任何异步函数以在解析后添加行为。在我看来,observable不是http调用的最佳选择,当一个简单的promise足够并且可以链接时,它们会导致样板文件的创建。
-
只需使用map()而不是subscribe()。您也可以使用toPromise(),然后获得then()。有了可观察的东西,你只需要用Promise获得所有东西,你只能得到零件,没有明显的好处(恕我直言)。
-
通过重试失败的请求来构建一些弹性也更容易。
-
@GünterZ?chbauer如果你致电促销,你为什么不使用诺言?
-
通过使用toPromise你正在使用一个承诺^^。我从来没有说过你不应该放弃observable,只是将它们转换为http用法的承诺。它真的更有价值。顺便说一句,有了地图你无法清楚地处理错误。
-
对于错误处理,您有catch()和finally()。
-
承诺,至少来自合理的图书馆是可以取消的。更不用说在Angular 1中承诺取消了。
-
有没有提到更多信息? developer.mozilla.org/en/docs/Web/JavaScript/Reference/…没有提到取消。
-
当然,例如:bluebirdjs.com/docs/api/cancellation.html。我认为这个任务的正确原语实际上是一个异步迭代器(基于拉力,实际上是懒惰和等待)。
promise和observable之间的最基本区别是如果没有功能订阅它,Observable模块将无法工作。因此减轻了服务器的负担。
在承诺中,无论您是否真正使用了响应,它都会在您的服务器请求和有效负载ping之后向您发送一个promise对象;有时不受欢迎。
基础是减少节点或其他服务器的负载。
-
在什么情况下你设置一个角度http调用而不使用响应?这对我没有任何意义。我理解延迟加载,但不知道它是如何适用的。不要试图粗鲁,只是真的不明白为什么人们把这作为一个论点。
-
这并不意味着将发送请求但忽略响应。您可以使用一系列不同的方法来构建带有map(),filter(),replay(),flatMap()等等的可观察对象,但是您可能出于某种原因决定,您不希望在满足某些条件的所有或有时晚些时候。这就像一个SQL查询,您可以提前准备和构建,并仅按需或重复发送。
-
如果两个不同的客户订阅了它 - 它会工作两次,它将推迟调用,直到你真正需要它。