什么时候使用Promise而不是observable?

时间:2018-05-10 09:29:48

标签: angular ecmascript-6 promise rxjs observable

是否有任何情况,与可观察的相比,承诺更强大?我知道可观察的许多好处而非承诺。但无论如何,我应该只使用对可观察者的承诺。

我找到了这个链接promises vs obserbales。但这总是向我展示了可观察性对承诺的好处。我想知道承诺对可观察物的好处。

6 个答案:

答案 0 :(得分:4)

使用Promise 代替Observable,时间为:

  • 你需要处理(未来的回应)事件,无论如何(没有取消订阅,没有取消:订阅后,会有答案,100%,你必须处理它,100%,代码< em>将执行)
  • 一个订阅=一个事件处理:源中只有一个事件,因此未来的响应和完成是同一个事件。

使用Observable 代替Promise,时间为:

  • 您希望能够接受来自同一来源的多个事件
  • 你需要一个&#34;我已经完成了这个事件流&#34;处理
  • 您希望能够取消订阅可能永无止境的数据流,并随时重新订阅(也意味着您可能根本不需要完成订阅:例如,如果没有任何反应在10秒内,让我们取消订阅,没有人会处理迟到的答案)
  • 您想使用RxJS&#34; Stream API&#34;预处理回复的数据。

通常,Observable模式是一个扩展的Promise模式,具有更多的工具和功能。由您决定是否使用Promises来限制代码。它首先是一个自定义库,然后被包含在ES2016中。

此外,我建议使用特定问题参数研究问题:您需要更快的应用程序吗?您将使用旧版模块吗?

答案 1 :(得分:4)

一个观察者做了承诺所做的一切,甚至更多。如果需要承诺,可以使用toPromise()方法将其切换为承诺。

如果

,则必须选择一个可观察的
  • 任何对于可观察事物而非承诺而且在related question中详细解释的特征都是需求的(特别是不完整的可观察量和可观察到的多个值)
  • 使用它的API需要一个可观察的,并且不使用Observable.from(...)安全结构来统一可观察和承诺

如果使用的代码仅使用可观察的代码,则可以选择 作为。

如果使用它的API需要承诺并且不使用Observable.from(...)安全结构,则可以在可观察的情况下选择承诺必须

如果

,可以选择承诺可以
  • 其使用的代码仅使用promises(特别是async函数)
  • 需要立即订阅并链接然后,因为链条应该在observables let observable = ...; observable.subscribe(...); return observable中被破坏(这也需要跟踪多个订阅以防止observable被取消)< / LI>

答案 2 :(得分:2)

可观察者是懒惰的->在我们订阅可观察者之前,什么也不会发生。 通过取消订阅可观察的对象可以随时取消以进行内存清理。 承诺只能有一个响应,但可观察到的可以有多个响应。

match

仅打印一个 在可观察中:

const promSingle = new Promise(resolve){
  resolve('a');
  resolve('b');
}
promSingle.then(value => {
  console.log(value)
})
const obSerMult = new Observable(observable){
  Observable.next('a');
  Observable.next('b');
  Observable.next('c');
  Observable.next('d');
}

obSerMult.subscribe(value => {
  console.log(value);
})

答案 3 :(得分:0)

来自:Randall Koutnik的书“使用RxJS构建反应性网站”。

可观察对象就像数组,它们表示事件的集合,但是也像承诺一样,它们是异步的:集合中的每个事件在将来都会到达不确定的位置。这与承诺(例如Promise.all)的集合不同,可观察对象可以处理任意数量的事件,而承诺只能跟踪一件事情。可观察对象可用于为按钮的点击建模。它代表了应用程序整个生命周期内发生的所有点击,但是这些点击将在我们无法预测的将来的某个时刻发生。

答案 4 :(得分:0)

承诺很热衷,因此请在希望任何事情发生而无需任何触发的情况下使用它们。 而 Observable 是懒惰的,可用于执行需要来自输入或其他某些触发的事情,并且不需要在应用加载后立即发生

答案 5 :(得分:0)

看看这篇文章: https://scholarbasta.com/promises-vs-observables/

承诺在以下情况下使用,

  1. 您真的不需要退订此活动。
  2. 活动一次性完成。
  3. 这个事件并没有真正消耗你太多的记忆。

在以下情况下使用 observable:

  1. 您需要取消订阅此活动,
  2. 正在发出多个流,您需要对它们执行各种操作。假设您需要过滤/映射一些值。 Rxjs 库在这方面非常强大。
  3. 有多个值来自同一来源。