Я пытаюсь сделать следующее. Получить количество страниц из API. Каждая страница имеет несколько результатов. Я проверяю все результаты с моим состоянием. Если результат соответствует условию, тогда мне нужно закончить проверку, завершить поиск страницы и передать результат другой функции. Я не понимаю, как завершить ajax (выполнение getData () в функции checkPages ()) и выйти из цикла for в том же месте. Ключевые слова break и return не помогают. Пожалуйста, скажите мне, как это сделать. Может быть, мне нужно сделать, чтобы реорганизовать мой код. Мне не очень нравится «бросать» результаты функции в функцию. Я не использую async / await, потому что мне нужна совместимость со старыми браузерами.

getData("url-to-get-data").done(function (result) {
    checkPages(result.total_pages);
});

function getData(url) {
    return $.get({
        url: "url-to-get-data"
    })
}

function checkPages(pagesCount) {
    for (var i = 2; i <= pagesCount; i++) {
        getData("url-to-get-data", i).done(function(result) {
            var today = checkToday(result);
            if (today != null) {
                //someMethod
                //how to end the getData function and the for loop
            }
        });
    }
}

function checkToday(response) {
    var results = response.results;
    var today = new Date();
    var day = today.getDate();
    var month = today.getMonth();
    for (var i = 0; i < results.length; i++) {
        var d = new Date(results[i].release_date);
        if (d.getDate() === day && d.getMonth() === month) {
            return results[i];
        }
    }
    return null;
}
0
starmucks 21 Авг 2018 в 14:24

3 ответа

Лучший ответ

Простейшее изменение вашей функции checkPages

Внутренняя функция, которая вызывает себя как требуется

function checkPages(pagesCount) {
    function checkPage(i) {
        if (i <= pagesCount) {
            getData("url-to-get-data", i).done(function(result) {
                var today = checkToday(result);
                if (today == null) { // only get next page if today is null
                    checkPage(i+1);
                }
            });
        }
    }
    checkPage(2);
}
2
Jaromanda X 21 Авг 2018 в 11:58

Если я правильно понимаю, вы пытаетесь сделать что-то подобное?

ОБНОВЛЕНИЕ: реализована очередь для проверки завершения запроса

getData("url-to-get-data").done(function (result) {
    checkPages(result.total_pages);
});

function getData(url) {
    return $.get({
        url: "url-to-get-data"
    })
}

function checkPages(pagesCount) {
    let doContinue = true;
    let loading = false;
    let i = 2;
    var checker = setTimeout(()=>{
      if(i > pagesCount) clearTimeout(checker);
      if(!loading){
          loading = true;
          getData("url-to-get-data", i).done(function(result) {
            var today = checkToday(result);
            if (today != null) {
                clearTimeout(checker);
            }
            i++;
            loading = false;
        });
      }
    },100);
}

function checkToday(response) {
    var results = response.results;
    var today = new Date();
    var day = today.getDate();
    var month = today.getMonth();
    for (var i = 0; i < results.length; i++) {
        var d = new Date(results[i].release_date);
        if (d.getDate() === day && d.getMonth() === month) {
            return results[i];
        }
    }
    return null;
}
1
Domenik Reitzner 21 Авг 2018 в 11:52

Сделайте ваш ajax-вызов синхронным или используйте функции обратного вызова, чтобы получать больше данных, пока не будут выполнены условия.

0
Jonas B 21 Авг 2018 в 12:02
51947636