【问题标题】:Split array into chunks/bulks and made operations with them one by one将数组拆分为块/块并一一进行操作
【发布时间】:2019-03-15 17:48:19
【问题描述】:

我对标签有点抱歉,可能我理解我的问题不正确并且错误地使用它们但是..

我的项目面临的问题对我来说是新的,我以前从未经历过。因此,就我而言,我有来自 DB(Mongo,100'000+ 文档)的大量数据集响应,我需要 http-request 文档中的每个特定字段。

数据集中的示例数组如下:

{
    _id: 1,
    http: http.request.me
},
{
    //each doc of 99k docs more
}

所以猜你已经明白我不能使用默认的for loop,因为

  1. 如果是async 我会收到大量的 API 请求并且会 被禁止/限制/无论如何
  2. 如果我做到了one-by-one,我需要大约 12-23 小时 在我的循环完成之前等待。 (其实这种方式在 使用)

这就是我现在正在尝试做的事情

  1. 还有另一种方式,这就是我在这里的原因。我可以将我的巨大数组分成块,例如每个 5/10/100..N 并请求它们one-by-one

    │→await[request_map 0,1,2,3,4]→filled
    │→await[request_map 5..10]→filled
    │→await[request_map n..n+5]→filled
    ↓
    

根据Split array into chunks 我可以轻松做到。但是我应该使用 2 个 for 循环,第一个将拆分默认数组,第二个 async-request 这个新数组(长度 5/10/100...N)

但我最近听说过反应式范式和RxJS(可能)可以解决这个问题。这是正确的吗?我应该使用什么运算符?我应该使用什么关键字来查找相关问题? (如果我用谷歌搜索反应式编程,我会收到很多使用 react.js 的无用结果,但不是我想要的)

所以我应该关心这一切,只写一个未优化的代码,还是有一个 npm-module 用于那个或另一个更好的模式/解决方案?

可能我在这里找到并回答 RxJS 1 array item into sequence of single items - operator我现在正在检查,但我也感谢任何相关的贡献 对这个问题


RxJS 在这种情况下确实很有帮助,值得一看。这是一个 此类问题的优雅解决方案

【问题讨论】:

  • 澄清一下,整个请求数组是在内存中,还是每次都需要从数据库中查询一批 5 个请求?
  • Y,具有必要 url 的整个数组都在内存中,我只需要从它一个一个地查询一批 5(n) 个请求。据我了解,RxJS 很好。但是我仍然不明白如何将它与http 一起使用(但很容易按照我的意愿划分数组)

标签: javascript arrays asynchronous optimization rxjs


【解决方案1】:

利用bufferCount和concatMap

range(0,100).pipe(
    // save each http call into array as observable but not executing them
    map(res=>http(...)),
    //5 at a time
    bufferCount(5),
    //execute calls concurrently and in a queue of 5 calls each time
    concatMap(res=>forkJoin(res))
).subscribe(console.log)

【讨论】:

  • 至于现在我正在使用教程中的另一个代码,理解import 在 Node/Common.JS 中的工作方式并非易事,但我只是检查了这个,对在bufferCount(5) 之后,我收到了我想要的东西。此外,我想将rxmarbles.com 添加到帮助我理解这一点的事情列表中。
  • 很高兴它有助于解决问题
【解决方案2】:

实际上有一种更简单的方法可以使用mergeMap 运算符来做你想做的事,它是第二个可选参数,用于设置并发内部 Observables 的数量:

from([obj1, obj2, obj3, ...]).pipe(
  mergeMap(obj => /* make a request out of `obj` */, 5), // keep only 5 concurrent requests
).subscribe(result => ...)

【讨论】:

    猜你喜欢
    • 2022-11-22
    • 2022-01-06
    • 2018-11-09
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多