Функция [].map
не ожидает разрешения ваших элементов, поэтому ваш код в настоящее время отправляет все запросы (как вы сказали, около 3000) параллельно.
Вы можете использовать for...of
вместо того, чтобы запускать только один запрос за раз.Например:
async function makeRequests (lines) {
for (const line of lines) {
const encodedLink = encodeURI(line.link)
const response = await axios.get(encodedLink)
// ...your response handling code here...
}
}
makeRequests(jsonParsed)
Если вы хотите подождать 2 секунды между каждым запросом, вы можете добавить эту строку кода в ваш цикл for...of
:
await new Promise(resolve => setTimeout(resolve, 2000))
Лучшее решение
Решение, приведенное выше, работает, но я предполагаю, что ваш веб-сервер может, вероятно, принимать более одного запроса за раз, поэтому, возможно, идеальным сценарием было бы ограничить ваш код, чтобы он выполнял только до N запросов впараллельно в данный момент времени.Таким образом, вы не заполняете свой сервер, но можете получать результаты быстрее, чем один запрос за раз.
Модуль bluebird NPM позволяет вам делать это с помощьюих функция Promise.map .
Эта функция получает ваш список элементов в качестве первого аргумента, функцию, которая выполняет что-то и возвращает обещание для каждого элемента в качестве второго аргумента, и объектс ключом concurrency
, описывающим, сколько элементов вы хотите разрешить обрабатывать параллельно в качестве третьего аргумента.
Вот как это может работать:
const bluebird = require('bluebird')
async function makeRequests (lines) {
await bluebird.map(
lines,
async (line) => {
const encodedLink = encodeURI(line.link)
const response = await axios.get(encodedLink)
// ...your response handling code here...
},
{ concurrency: 3 }
)
}
makeRequests(jsonParsed)