@Funny_Cat

Как изменить код таким образом, чтобы промисы выполнялись поочередно?

Добрый день! У меня появилась проблема с синхронностью выполнения обращения к API. Получаю код ошибки 429 (пользователь отправил слишком много запросов за последнее время). Как сделать так, чтобы промисы выполнялись поочередно друг за другом?

// общая функция вызова ajax 

function readTextFile(file, callback) {
    var rawFile = new XMLHttpRequest();
    rawFile.overrideMimeType("application/x-ndjson");
    rawFile.open("GET", file, true);
    rawFile.onreadystatechange = function() {
        if (rawFile.readyState === 4 && rawFile.status == "200") {
            callback(rawFile.responseText);
        }
    }
    rawFile.send(null);
}

// получить все турниры через API

readTextFile("........", async function(text){

    ...
    var dataObject = JSON.parse('[' + data + ']');      
    var promises = [];    
    let result = [];
    var let = 0;
        
        while (i <= 10) {
            promises.push(get_results(dataObject[i].id));
            i++;
        }

        const data = await Promise.all(promises).then((value) => { console.log("qqq")});
});

// получить результаты по конкретному турниру через API

function get_results(tournament_id){
    
    return new Promise((resolve) => {
    
    readTextFile(".......", function(text){
        var data = text.split( '}\n{' ).join( '},{' );
        data = data.split( '\r\n' ).join( '|' );
        var dataObject = JSON.parse('[' + data + ']');
        var q = JSON.stringify(dataObject);
        var request= new XMLHttpRequest();

        request.onreadystatechange = function(){

            console.log(request.responseText);

        }
        
        request.open("POST", "includes/update_users_list.php", true);
        request.setRequestHeader("Content-type", "application/json");
        request.send(q);
    })
    })
}
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
TTATPuOT
@TTATPuOT
https://code.patriotovsky.ru/
Посмотрите в сторону async/await: https://developer.mozilla.org/en-US/docs/Web/JavaS...
Ваш цикл будет выглядеть примерно так:
while (i <= 10) {
  const result = await get_results(dataObject[i].id);
  i++;
}

+ между запросами стоит сделать задержку, возможно, у сайта есть троттлинг на количество запросов в минуту/секунду. Сейчас вы все запросы бахаете на api разом.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы