Я немного извиняюсь за теги, возможно, я не правильно понял свою проблему и использовал их неправильно, но..
Проблема, с которой я столкнулся в своем проекте, для меня новая, и я никогда раньше с ней не сталкивался. Итак, в моем случае у меня есть огромный набор данных из БД (Mongo, более 100 000 документов), и мне нужно http-request каждое конкретное поле из документа.
Пример массива из набора данных будет выглядеть так:
{
_id: 1,
http: http.request.me
},
{
//each doc of 99k docs more
}
Думаю, вы уже поняли, что я не могу использовать for loop по умолчанию, потому что
async мне сделают огромный запрос к API и я
быть запрещенным / ограниченным / каким бы то ни былоone-by-one это займет у меня около 12-23 часов
ожидание, пока мой цикл не завершится. (на самом деле, этот путь находится в
использовать)This is what I'm trying to do right now
есть и другой путь, и именно поэтому я здесь. Я мог бы разделить свой огромный массив на куски, например, каждые 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
↓
Согласно Разделить массив на куски я легко мог это сделать. Но тогда я должен использовать 2 for цикла, первый будет разделять массив по умолчанию, а второй async-request этот новый массив (длина 5/10/100...N)
Но недавно я услышал о реактивной парадигме и RxJS которая (вероятно) может решить эту проблему. Это правильно? Какой оператор мне использовать? Какое ключевое слово следует использовать для поиска относительных проблем? (если я погуглю реактивное программирование, я получу много бесполезного результата с react.js, но не то, что я хочу)
Так должен ли я заботиться обо всем этом и просто писать неоптимизированный код, или есть npm-module для того или иного лучшего шаблона/решения?
Probably I found and answer here RxJS 1 array item into sequence of single items - operator I'm checking it now, but I also appreciate any relevant contribution to this question
RxJS has truly been helpful in this case and worth looking. It's an elegant solution for this kind of problems
Y, весь массив с необходимыми URL-адресами находится в памяти, и мне просто нужно запросить из него пакет из 5 (n) запросов один за другим. Насколько я понимаю, RxJS хорош. Но я до сих пор не понимаю, как это использовать с http (но очень легко разделить массив, как я хочу)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте 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.info)
На данный момент я использую немного другой код из учебника, и было нетривиально понять, как import работает в Node/Common.JS, но я просто проверяю этот, и сразу после bufferCount(5) я получаю именно то, что я хочу . Также я хотел бы добавить rxmarbles.com в список вещей, которые помогли мне это понять.
Рад, что помог решить проблему
На самом деле есть еще более простой способ сделать то, что вы хотите, с оператором mergeMap и его вторым необязательным аргументом, который устанавливает количество одновременных внутренних Observables:
from([obj1, obj2, obj3, ...]).pipe(
mergeMap(obj => /* make a request out of `obj` */, 5), // keep only 5 concurrent requests
).subscribe(result => ...)
Просто чтобы уточнить, весь массив запросов находится в памяти, или вам нужно каждый раз запрашивать пакет из 5 запросов из вашей базы данных?