【问题标题】:When to use Promise over observable?何时使用 Promise 而非 observable?
【发布时间】:2018-10-20 12:48:50
【问题描述】:

在任何情况下,Promise 比 observable 更强大?我知道 observables 比 promises 有很多好处。但是在任何情况下,我都应该只使用承诺而不是可观察的。

我找到了这个链接,promises vs observables。但这总是向我展示了可观察对象优于承诺的好处。我想知道 promise 相对于 observables 的好处。

【问题讨论】:

  • Promise vs Observable的可能重复
  • 这个答案总是显示可观察的好处优于承诺。但我想知道承诺的好处。
  • Promise 是语言的原生部分。 Promise 是可互操作的。承诺很简单。 Promise 可以随时订阅。 Promise 只能解决一次。
  • 我不认为这是一个重复或“过于宽泛”的问题。我认为“太宽泛”的主要标准是需要澄清才能获得高质量的答案,或者有无数可能的高质量答案。这个足够具体,可以接收。

标签: angular ecmascript-6 promise rxjs observable


【解决方案1】:

使用 Promise 代替 Observable,当:

  • 无论如何你都需要处理(future response)事件(no unsubscribe, no cancel:订阅后会有答复,100%,你必须处理,100%,代码将被执行)
  • 一个订阅=一个事件处理:来自源的只有一个事件,所以未来的响应和完成是同一个事件。

在以下情况下使用 Observable 而不是 Promise:

  • 您希望能够接受来自同一来源的多个事件
  • 您需要一个“我已完成此事件流”处理程序
  • 您希望能够取消订阅可能永无止境的数据流,并随时重新订阅(这也意味着您可能根本不需要完成订阅:例如,如果在 10秒,我们退订吧,没人会处理迟到的答案)
  • 您想使用 RxJS“Stream API”来预处理您的响应数据。

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

另外,我建议使用特定的问题参数来研究问题:您需要应用程序更快吗?你会使用遗留模块吗?

【讨论】:

    【解决方案2】:

    一个 observable 做了一个 Promise 所做的一切,甚至更多。它总是可以通过toPromise() 方法切换到一个promise,以防需要promise。

    一个可观察的必须被选择而不是一个promise if

    • 需要任何可观察对象固有的特性,而不是承诺,并在 related question 中详细解释(特别是取消订阅、不完整的可观察对象和接收多个值的可观察对象)
    • 使用它的 API 需要一个可观察对象,并且不使用 Observable.from(...) 安全结构来统一可观察对象和承诺

    如果使用它的代码专门使用可观察对象,则可以选择可观察对象而不是承诺。

    如果 API 使用 Promise 并且不使用 Observable.from(...) 安全结构,则必须选择 Promise 而不是 observable。

    一个promise 可以被选择而不是一个observable if

    • 使用它的代码专门使用 Promise(特别是 async 函数)
    • 它需要设计为异步的
    • 需要立即订阅和链接然后,因为链应该在 observables 中被打破let observable = ...; observable.subscribe(...); return observable(这也需要跟踪多个订阅,以防 observable 可取消)

    【讨论】:

      【解决方案3】:

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

      Observables 类似于 数组,因为它们代表 事件的集合,但也类似于 promises它们是异步的:集合中的每个事件都会到达未来某个不确定的时间点。这与 promise 集合(如 Promise.all)不同,observable 可以处理任意数量的事件,而 strong>promise 只能追踪一件事。 observable 可用于对按钮的点击进行建模。它表示在应用程序的整个生命周期内将发生的所有点击,但这些点击将发生在我们无法预测的未来某个时间点。

      来自:Anton Moiseev 的书“使用 Typescript 进行 Angular 开发,第二版”。 :

      Promise有以下缺点:

      无法取消带有promise的待处理请求。

      promise 解决或拒绝时,客户端会收到数据或错误消息,但在这两种情况下,它都是一条数据。 JavaScript promise 不提供处理随时间传递的连续数据块流的方法。

      Observables没有这些缺点。

      【讨论】:

        【解决方案4】:

        Promises 是急切的,因此在您希望某事立即发生而无需任何触发的地方使用它们。 而 Observable 是惰性的,它可以用来做一些需要来自输入或其他东西的触发器并且不需要在应用加载时立即发生的事情

        【讨论】:

          【解决方案5】:

          Observable 是惰性的 --> 在我们订阅 observable 之前什么都不会发生。 Observable 可以随时取消订阅以进行内存清理。 Promise 只能有一个响应,但 observable 可以有多个响应。

          const promSingle = new Promise(resolve){
            resolve('a');
            resolve('b');
          }
          promSingle.then(value => {
            console.log(value)
          })
          

          只打印一个 在 Observable 中:

          const obSerMult = new Observable(observable){
            Observable.next('a');
            Observable.next('b');
            Observable.next('c');
            Observable.next('d');
          }
          
          obSerMult.subscribe(value => {
            console.log(value);
          })
          
          print will be a, b , c ,d
          

          【讨论】:

            【解决方案6】:

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

            Promise 在以下情况下使用,

            1. 您确实不需要取消订阅此活动。
            2. 活动一气呵成。
            3. 事件并没有真正消耗你的内存。

            在以下情况下使用可观察对象:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-01-04
              • 1970-01-01
              • 2020-12-18
              • 1970-01-01
              • 2019-07-10
              • 2021-08-17
              相关资源
              最近更新 更多