Пакетные и очереди API-вызовов в узле - PullRequest
0 голосов
/ 13 декабря 2018

Я использую 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)

1 Ответ

0 голосов
/ 13 декабря 2018

В итоге я использовал async.queue , но я все еще очень заинтересован в любых других решениях.

const array = ['address1', 'address2', 'address3', 'address4', 'address5', 'address6']

function asyncTime(value) {
    return new Promise(function (resolve, reject) {
        apiCall(ele).then(resp => {
            resolve(resp)
        })
    })
}

function test(array) {
    var q = async.queue(async function(task, callback) {
        console.log(await asyncTime(task))
         if(callback) callback()
     }, 3);

     q.push(array, function(err) {
         if (err) {
             console.log(err)
             return
         }
         console.log('finished processing item');
     });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...