【问题标题】:Angular 8: Breaking down HTTP request instead of sending in a lumpsumAngular 8:分解 HTTP 请求而不是一次性发送
【发布时间】:2020-03-06 01:54:15
【问题描述】:

您好 StackOverflow 社区成员,

我正在研究 Angular 8。我有一个关于如何分解我的 HTTP 请求的问题,而不是一次发送 1000 个请求,我希望每 50 个请求一次发送一次。我想不出任何方法来实现这一点。下面是我的代码 sn-ps:

for (let i = 0; i < products.length; i++) {
    this.myService.getProductInfoByCountryAndProductId(this.selectedCountries, this.product[i])
    .subscribe(
       (res) => { //get result },
       (error) => { //throw error },
       () => { //do something here });
}

上面的代码会一次性触发所有请求,想象一下如果我在products 数组中有 1000 个产品,这意味着它会循环 1000 次,并且会向服务器发送 1000 个请求并导致性能问题。有没有办法限制客户端不要一次性发送所有请求?

我试过combineLatest,结果不是我想要的。我想尝试concatMap,但这意味着它会逐个发送 HTTP 请求,并且需要很长时间来处理所有产品。有什么建议或想法吗?

【问题讨论】:

  • 您真的需要预先填写所有这些信息吗?不确定您的应用程序,但通常我希望使用分页并只加载我需要的内容。
  • @Bodacious 这不是显示数据,而是收集所有数据并将所有这些数据导出到 Excel 中。我的客户希望它能够导出所有产品(目前数据库中大约有 1400 多个产品)。我已经告诉他们他们可能会对性能问题产生影响,但他们坚持。
  • 明白了。而且我猜不可能在服务器端实现一个端点来返回所有内容?
  • @Bodacious 我建议这样做,在服务器端填充所有数据并将带有 Excel 附件的电子邮件发送给最终用户,但仍然没有从客户端得到任何响应。所以我想先在 SO 中搜索任何答案,如果可以的话,所以我不需要浪费时间在服务器端编写新的实现。
  • 这是可能的,当然,但即使它们是批处理的,您仍然会查看 1000 个 http 请求。您不必从服务器发送电子邮件,您只需要一个可以一次返回多个产品信息的端点。

标签: angular httprequest subscribe combinelatest concatmap


【解决方案1】:

您要解决的问题更多是关于架构而不是 Angular http 功能。

最后,通过 HTTP 交换的字节数将是相同的。您现在必须弄清楚“如何”。

如果您想减少 API 调用的数量,解决方案可以是调整您的 Web 服务以接受多个产品 ID,并且前端准备好接收数组而不是单个结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 2018-08-04
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多