Я использую API, который принимает адреса и возвращает мне координаты GPS.API принимает только один адрес, но он может обрабатывать 50 активных соединений в любой момент времени.Я пытаюсь создать функцию, которая будет отправлять 50 запросов, подождать, пока они все вернутся, и отправить еще 50.Или отправьте 50 запросов и отправьте следующий, так как предыдущий возвращается.Ниже приведен код, с которым я работал, но я застрял.
Одна проблема в batchFunct
.Цикл for
отправляет все вызовы API, не ожидает их возврата, а затем выполняет оператор if перед обновлением returned
.Это делает с учетом асинхронности узла.Я попытался поставить await
на вызов API, но это, по-видимому, останавливает весь асинхронный процесс (у кого-то есть пояснения по этому поводу) и эффективно заставляет его отправлять запросы по одному.
Есть ли какие-либо советы по адаптации этого кода или по поиску лучшего способа пакетной обработки и организации очередей запросов API?
const array = ['address1', 'address2', 'address3', 'address4', '...', 'addressN']
function batchFunc(array) {
return new Promise(function (resolve, reject) {
var returned = 1
for (let ele of array) {
apiCall(ele).then(resp => { //if but an await here it will send one at a time
console.log(resp)
returned++
})
};
if (returned == array.length) {
resolve(returned);
}
})
}
async function batchCall(array) {
while (array.length > 0) {
let batchArray = []
if (array.length > 50) {
for (let i = 0; i < 50; i++) {
batchArray.push(array[0])
array.splice(0, 1)
}
} else {
batchArray = array
array = []
}
let result = await batchFunc(batchArray);
console.log(result);
}
}
batchCall(array)