【问题标题】:How to reuse equal pending http requests observable in angular 4如何重用在角度 4 中可观察到的相等的待处理 http 请求
【发布时间】:2017-09-04 10:40:03
【问题描述】:

在我的项目中,有时由于我犯的错误或新的团队成员犯的错误,有时会有一个带有某些特定参数的 http 请求同时多次发送到远程后端(意思是相同的确切请求将出现在开发工具中的浏览器 http 请求中,是挂起的两倍)。

这种情况对我们不利,并且之前在远程响应此请求的速度低于发送它们的时间间隔的情况下给我们带来了问题。

这里显而易见的解决方案是始终确保我们在发送下一个相同类型的请求(和参数)之前得到某种类型的请求的答案。但我在想应该有一种方法来确保以一种通用的方式,如果某个请求即将通过 angular http 服务发送,如果该请求已经存在且处于挂起状态,则该服务可以返回 SAME observable 那是由上一个已挂起的请求返回(当我有 2 个不同且不相关的组件一个接一个地发出相同请求时,这将解决一些混乱的情况,这将使它们都订阅相同的 observable)。

我们已经有一个服务,它用 http 封装了我们项目中的所有用途。

问题是我如何才能实现这种行为(或者如果由于某种原因我的想法是错误的,也许我不应该以实现这种行为为目标?),我正在寻找最简单的解决方案(也许Angular已经实现了一些我错过的东西?)或者如果没有某种基于可观察的解决方案来检查我们将要发出的每个请求,如果请求已经存在且处于未决状态

【问题讨论】:

  • 请使用段落等格式化此问题。
  • 现在可以理解了吗?
  • 你可能会觉得这很有趣:hackernoon.com/…
  • 这可能就是我要找的东西,我只是在链接中寻找第 4 点的解决方案,以防止出现 2 个相同请求且处于 oending 状态的情况,我在源代码中看到了一些关于签入航班请求,但我无法理解代码如何检查请求是否处于待处理状态。如果你能让我专注于你是如何实现这一目标的,那真的可以让我朝着正确的方向前进

标签: angular http rxjs angular2-observables


【解决方案1】:

我想建议switchMap,但distinctUntilChanged 在这种特定情况下会有所帮助,因为我们想在参数不同时提出请求。我假设参数来自另一个 observable。

Rx.Observable
  .interval(300) // every 300ms
  .mapTo(Math.floor(Math.random() * 10) // emit a number from 0 to 9
  .distinctUntilChanged() // if number is the same, ignore it
  .flatMap(number => this.exampleService.makeRequest(number)) // make a request for a unique number
  .subscribe(response => console.log(response)); // log response

【讨论】:

  • 我无法理解这个 cade 的例子是如何回答这个问题的
【解决方案2】:

问题可能出在多个订阅中:

var res = this.myService.get();
var firstSubscription = res.subscribe(); // first http call
var firstSubscription = res.subscribe(); // second

尝试使用多播运算符:

var resShared = this.myService.get().share();

【讨论】:

  • 据我了解,此解决方案仅适用于当我的代码的 2 部分与作为 http 调用结果的相同 observable 一起工作时。如果 2 个不相关的组件进行相同的 http 调用,这将无济于事,因为它们将获得 2 个不同的 observable,因为这是默认的 http 服务行为,所以这个答案根本不能解决问题
猜你喜欢
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
相关资源
最近更新 更多