【问题标题】:Stop execute ajax in for loop在 for 循环中停止执行 ajax
【发布时间】:2018-08-21 11:24:09
【问题描述】:

我正在尝试执行以下操作。从 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;
}

【问题讨论】:

  • 那是因为你在循环中执行 ajax 请求......它们是异步的,你不会得到你想要的结果,因为当你的第一个请求完成时,我确定你的循环结束.. 请在 StackOverflow 周围寻找类似的问题,因为有很多。
  • 您需要确保按顺序发出请求 - 到目前为止,所有请求都已“启动”,然后才能执行任何“检查”

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


【解决方案1】:

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

【讨论】:

  • 您在 cmets 中写道:不要获得下一页。例如,如何做到这一点?请告诉我如何正确地做。清楚且描述清楚的地方。
  • erm 我写了dont' get next page ...因为它没有 - 没有什么神秘...修改了代码
【解决方案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;
}

【讨论】:

  • 您的代码也会在检查第一个请求之前将所有请求排入队列 @9​​87654322@
  • @Domenik Reitzner 这当然没有帮助。其实这个地方放不下break这个词。
  • @starmucks,是的,忘记删除那个了​​....它也在正确的位置:) 请查看更新
  • @JaromandaX 非常感谢您的帮助。我还想知道如何按照最佳实践正确执行此类工作。在这种情况下,“与()的承诺”会有所帮助吗?
  • @Domenik Reitzner 谢谢,但另一种解决方案似乎更优雅。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多