停止在for循环中执行ajax

时间:2018-08-21 11:24:10

标签: javascript jquery ajax for-loop async-await

我正在尝试执行以下操作。从API获取页面数。每个页面都有多个结果。我会根据自己的情况检查所有结果。如果结果符合条件,那么我需要完成检查,完成页面搜索并将结果传递给另一个函数。我不明白如何结束ajax(在checkPages()函数中执行getData()执行)并在同一位置退出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 个答案:

答案 0 :(得分:2)

对checkPages函数的最简单更改

根据需要自行调用的内部函数

import com.gargoylesoftware.htmlunit.javascript.host.file.File;

答案 1 :(得分:1)

如果我理解正确,您正在尝试执行类似的操作?

更新:实现了que检查请求是否已完成

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;
}

答案 2 :(得分:0)

使ajax调用同步或使用回调函数来不断获取更多数据,直到满足条件为止。