【问题标题】:Converting Observable to Promise将 Observable 转换为 Promise
【发布时间】:2018-09-10 12:11:42
【问题描述】:

将 observable 对象转换为 promise 是否是一种好习惯,因为 observable 几乎可以在所有场合使用而不是 promise?

我最近开始学习 Angular,并在我的工作场所的一个新项目(Angular 5)中遇到了以下代码 sn-p。此代码 sn -p 用于加载数据列表,例如客户列表。此客户列表数据集是作为一次性操作接收的,而不是作为流接收的。因此,使用 Promise 没有技术限制。但我想知道是否有任何缺点或限制。

  getViewDataForPage(): Promise<any> {
    return this.commonDataService.getViewDataForPage(args_set)
      .toPromise()
      .catch(error => this._exceptionService.catchBadResponse(error));
  }


  //in commonDataService.ts
  getViewDataForPage(args_set): Observable<any> {
    /** logic goes here */
    return this.httpConnection.post(viewDataRequest, args);
  }

【问题讨论】:

  • 感谢您的推荐。是的,我之前读过这篇文章。它的答案也有一些相互矛盾的想法。这就是为什么我单独提出这个问题,以了解有关性能下降等的任何附加细节。相互矛盾的想法:“如果你想使用反应式风格,只需在任何地方使用 observables。如果你只有 observables,你可以轻松编写。如果你把它们混合起来,它就不再那么干净了。” “我只是在声明,我认为在 NG2 中主要通过 http 运行 Observables 的人没有任何真正理由使用 Observables over Promises 进行调用。”

标签: javascript angular promise observable


【解决方案1】:

这取决于您的要求,技术上的 observables 比 Promise 更好,因为它们提供了 Promise 的功能等等。使用 Observable,您是否想处理多个事件都没有关系。

Observablescancelable 即,使用unsubscibe() 你可以取消一个 observable 而不管它的状态。

另一方面,Promises 只处理一个异步事件,即..,如果发生错误,它将解决或拒绝

Promise 的一个好地方是,如果您有一个偶数需要处理。

let connect=new Promise((resolve,reject)=>{

if( connection Passed){
   resolve("Connected");
 } else{
   reject("failed");
 }
}

【讨论】:

  • 我的问题是在订阅 observable 的情况下,在使用前将其转换为 Promise 是一种好习惯吗?您提到了“技术上可观察的东西比承诺更好”。这是否意味着将 observable 转换为 Promise 不是一个好的决定?
  • 这不是一个好的决定,也不是一个突出的决定,因为您在可观察对象上获得了多个运算符,例如 map、filter、tap 等。此外,您可能会遇到必须取消的情况这个可观察到的,对于某些情况下,您的代码的自动化测试在图片中,您可能需要取消并执行@DonD 执行的否定测试
【解决方案2】:

你可以同时使用。 Observable 用于当您将在一段时间内收到不同的值时,更像是当您是某杂志的 订阅者 时,当您是 ma​​zagazine 有新版本,您将成为通知者,所有订阅者都会发生同样的情况,每个人都会收到新的价值,或者在这种情况下是新杂志

Promise 的情况下,它是异步的,就像一个可观察的,但它只是发生的。

那么如果下面的代码发生在这种情况下是可以的 promise

getViewDataForPage(): Promise<any> {
    return this.commonDataService.getViewDataForPage(args_set)
      .toPromise()
      .catch(error => this._exceptionService.catchBadResponse(error));
  }


  //in commonDataService.ts
  getViewDataForPage(args_set): Observable<any> {
    /** logic goes here */
    return this.httpConnection.post(viewDataRequest, args);
  }

【讨论】:

  • 是的,正如我在问题中提到的那样,我知道这只会执行一次并且不会出现错误。但我想考虑其他方面,例如性能。
猜你喜欢
  • 2017-01-12
  • 1970-01-01
  • 2016-12-25
  • 2018-02-19
  • 2018-08-22
  • 2016-08-15
  • 2021-09-21
相关资源
最近更新 更多