Время прочтения: 2 мин.

В связи с таким поведением и ограничением на количество запросов по одному токену, который выдает API, нам необходимо было посылать ей последовательные запросы. То есть каждый последующий запрос должен дождаться ответа предыдущего.

Начнем.

Для начала напишем функцию, которая посылает первый запрос:

function getUID(token = 'tokenForAPI') {

    let xr = new XMLHttpRequest();

    xr.open('POST', 'https://какой-то-сайт/', false);
    xr.setRequestHeader('Content-Type', 'application/json')
    try {
        xr.send(JSON.stringify({
            "token": token
        }));
        if (xr.status != 200) {
            alert(`Ошибка ${xr.status}: ${xr.statusText}`);
        } else {
            getStatus(JSON.parse(xr.response))
  }
    } catch (err) 
        alert("Запрос не удался" + err);
    }
}

Если запрос удался, запускаем функцию getStatus, в которую передадим результат из предыдущего запроса – uid задачи на сервере.

Теперь напишем эту функцию:

function getStatus(uid) {

    let xr = new XMLHttpRequest();
    xr.open('GET', 'https://какой-то-сайт/'+ uid, false);
    try {
        xr.send();
        if (xr.status != 200) {            
            alert(`Ошибка ${xr.status}: ${xr.statusText}`);           
        } else {
            let res = JSON.parse(xr.response)
            if (res.status != 0) {
                return setTimeout(() => {
                    return getStatus(uid)
                }, 3000);
            }
            else {
                getResult(uid)
            }
        }
    } catch (err) 
        alert("Запрос не удался");
    }
}

Итак, мы посылаем запрос к серверу, чтобы узнать статус задачи. Если статус не 0 (0 – означает что все хорошо, наши данные готовы) – то посылаем запрос снова через 3 секунды.

Если все хорошо, мы запускаем функцию getResult, в которую тоже передаем uid задачи.

Теперь напишем нашу последнюю функцию получения результата от сервера.

function getResult(uid) {
    let xr = new XMLHttpRequest();
    xr.open('GET', 'https://какой-то-сайт/'+ uid, false);

    try {
        xr.send();
        if (xr.status != 200) {
            alert(`Ошибка ${xr.status}: ${xr.statusText}`);
        } else {
            let res = JSON.parse(xr.response)
            alert(res)
        }
    } catch (err)
        alert("Запрос не удался");
    }
}

Вот и все, теперь мы можем взаимодействовать с API сервера в синхронном стиле, для предотвращения блокировки из-за количества запросов. Функцию getUID мы можем обернуть в цикл, для обработки большого количества данных через API.

Спасибо за внимание.

Источник примеров XMLHttpRequest запросов:

https://learn.javascript.ru/ajax-xmlhttprequest