【问题标题】:How can I hold on http calls for a while?我怎样才能让http调用保持一段时间?
【发布时间】:2020-06-22 16:38:51
【问题描述】:

我有以下问题,如果有人能给我一个想法,我将不胜感激,我尝试了一些,但没有奏效。 考虑代码:

 while (this.fastaSample.length > 0) {
      this.datainputService
        .saveToMongoDB(this.fastaSample.slice(0, batch))
        .subscribe();
    }

它应该解决我无法在单个http调用中发送数据的问题,因为它太大了,我可以毫无问题地发送10%,超过这个,它不起作用! 所以我想,我应该发送小批量,我在这里咨询了一些问答,他们帮助了我,但没有解决问题。

我曾尝试像在 node 中那样使用 await,但它不起作用;它一次发送所有的http,最好停止/保持代码直到最后一个http调用完成,这很好! 有什么建议吗?

【问题讨论】:

  • 第一:我没有看到任何代码显示您如何发送数据,也没有看到您如何接受数据。正常的多部分 POST 将在完成上传所需的时间内保持活动状态,那么您的端点有何不同?

标签: node.js angular http


【解决方案1】:

我想你可以通过使用 fromconcatAll 使这一切变得更好和 rxjs:

未经测试的代码

// first create batches by chunking the array
const batches = Array.from(
  { length: Math.ceil(fastaSample.length / batch) },
  (v, i) => fastaSample.slice(i * batch, i * batch + batch)
)

// Second go over these chunks using `from` and `concatAll`:
from(batches).pipe(
  map((batch) => this.data.inputService.saveToMongoDB(batch)),
  concatAll()
).subscribe();

这将连续拨打电话。如果可以同时做请求,你可以做mergeAll()


但就像@Mike 评论的那样,似乎应该在 MongoDB 后端处理该问题并接受多部分请求。这样你就不需要分块了

【讨论】:

  • 你好,谢谢,我在这里测试。如果我不分块,Angular 页面就会崩溃,节点应用程序会说它内存不足,并且也会崩溃。分块数据不是我最喜欢的选择,它太经验主义了,但它是我能想到的最好的选择。当你说使用mergeall,而不是map?
  • @JorgePires 而不是concatAll。使用 concatAll 它会在第一个请求完成后发送下一个请求,而使用 mergeAll 它只是一次调用它们。我想。关于内存不足,这也是因为正在发送的数据不是流,就像多部分请求一样。所以我的建议仍然是调查这个。你的saveToMongoDB 方法看起来如何?
  • mergeall 崩溃了。
  • @JorgePires 所以你确实看到了第二个网络请求,但它挂了?运算符也是 concatAll,而不是 concatMap。你链接错了:)
  • @JorgePires multipart 绝对是要走的路。它实际上是最简单的解决方案,不会做任何 UI 阻塞。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2022-08-20
  • 2014-01-02
  • 2019-09-16
  • 2020-06-20
  • 2012-10-12
相关资源
最近更新 更多