在处理

时间:2016-01-08 05:51:00

标签: javascript jquery ajax

我一直在忘记我的SO账号!

问题:

我的工具允许用户在过去10年中每年点击一次以显示一组数据。并非所有年份都有数据,但他们仍然需要选择浏览每年并可能获得“无记录”消息。

在初始页面加载时,我只想显示最近的数据年份,然后停止发送任何剩余年份的ajax调用。目标是当用户可能只关心最近一年时,防止在页面加载时发送10个ajax调用。

最初,我的方法是将所有年份通过$ .each()循环与ajax调用,并且在该年的ajax调用返回数据的第一年,它将突破循环。所以我尝试了类似的东西:

function getData(path,id,year) {
        return $.ajax({
            url: "includes/"+path,
            data: { id: id, year: year },
            dataType:"json"
        });
    }

$.each([ 2015,2014,2013,2012,2011 ], function( k, v ) {
        getData("url.php", id, v)
            .done(function() {
                $('#wrapper').show();
                $('button[data-year="'+v+'"]').addClass('active');
                someorefunctions();
            })
    });

问题是当getData具有实际数据响应时,我似乎无法弄清楚如何突破每个循环。如果2014年有数据,我希望循环到2014年,因为它获取了2014年的数据,按照指示显示数据,然后停止发送所有剩余年份的请求。

我听到了强制同步的一般警告,因为它们的异步性质没有将ajax放入循环中。但我也想防止加载大量不需要的数据。

这可能吗?我最初使用async: false获得了所有这些代码,但我们真的希望远离它。

编辑:经过一夜的睡眠,我觉得我想做的事情是不可能的。因为是否发出下一个ajax请求取决于先前是否成功/返回数据,我必须同步执行此操作。 .each发送请求,但无论前一个是否已完成,它都将继续发送下一个请求。对我来说痛点是,虽然我希望这个特殊的循环ajax同步运行,但这并不意味着我希望所有其他脚本都停止。

编辑我最终使用了一个版本的ajax调用本身,这确实解决了在第一次成功的数据响应时停止ajax的主要问题。

function getFirstData(path,id,years,idx) {
        return $.ajax({
            url: "includes/"+path,
            data: { id: id, year: years[idx] },
            dataType:"json",
            success: function(data) {
                successfunctions();
            },
            error: function(xhr) {
                getFirstData(path,id,years,++idx);
            }
        });
    }

getFirstData("getDonorsByCycle.php", id , [2016,2015,2014,2013] , 0);

2 个答案:

答案 0 :(得分:0)

我完全不理解这个问题,但希望这会有所帮助。

使用success代替完成。 success函数仅在返回某些数据时执行。因此,如果您有实际数据响应success函数触发。

success内,您可以return false;退出循环。

$.each([ 2015,2014,2013,2012,2011 ], function( k, v ) {
        getData("url.php", id, v)
            .success(function() {
                //do something
                if(breakcondition)
                {
                  return false;
                 }
            })
    });

您可以以类似的方式使用error来处理没有返回数据的情况。

答案 1 :(得分:0)

您是否考虑过一次ajax调用,一次性检索所有年份的数据,然后相应地处理数据? 如果这不可能,您可以维持当前正在处理的那一年,只有在没有返回数据的情况下,才能在下一年对getData进行调用。如果返回数据,则处理回调并退出getData调用。以下内容应该有效。

var years = [2015, 2014, 2013, 2012, 2011];
function getData(path,id,idx) {
    return $.ajax({
        url: "includes/"+path,
        data: { id: id, year: years[idx] },
        dataType:"json",
        success: function(dataFromServer) {
            if (dataFromServer)
                $('#wrapper').show();
                $('button[data-year="'+years[idx]+'"]').addClass('active');
                someorefunctions();
            else
                getData(path,id,++idx);
        },
        error: function(xhr) {
            handleError(xhr);
    });
}

getData("url.php", id, 0);