Я пытаюсь сделать следующее. Получить количество страниц из 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;
}
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);
}
Если я правильно понимаю, вы пытаетесь сделать что-то подобное?
ОБНОВЛЕНИЕ: реализована очередь для проверки завершения запроса
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;
}
Сделайте ваш ajax-вызов синхронным или используйте функции обратного вызова, чтобы получать больше данных, пока не будут выполнены условия.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.