我一直在忘记我的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);
答案 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);