所以情况如下:
我有一个递归的异步AJAX调用,它从服务器中提取数据。此递归调用仅在用户登录时发生一次。 我有另一个页面需要AJAX调用才能导航(基本上是一个延迟加载的树)。当第一个AJAX呼叫正在发生时,这些其他呼叫需要一段时间才能通过,而且由于第一个呼叫可能会产生多达2,000个请求,因此这种延迟有时会相当长。
基本上我想要实现的是"暂停"进行另一次调用时的递归调用。伪代码:
function recursiveAjax(){
$.ajax( {
async : true,
url : 'someurl',
dataType : 'json',
beforeSend : function(xhr) {
// do stuff
},
error : function(xhr, ajaxOptions, thrownError) {
// handle errors
},
success : function(data) {
//conditions
recursiveAjax();
}
});
}
function navigationAjax(){
$.ajax( {
async : true,
url : 'someurl',
dataType : 'json',
beforeSend : function(xhr) {
// pause recursiveAjax();
},
error : function(xhr, ajaxOptions, thrownError) {
// handle errors
},
success : function(data) {
//conditions
// resume recursiveAjax();
}
});
}
答案 0 :(得分:2)
最简单的方法:
window.recurse = true;
function recursiveAjax(){
$.ajax( {
async : true,
url : 'someurl',
dataType : 'json',
beforeSend : function(xhr) {
// do stuff
},
error : function(xhr, ajaxOptions, thrownError) {
// handle errors
},
success : function(data) {
//conditions
if(window.recurse){
recursiveAjax();
}
}
});
}
function navigationAjax(){
window.recurse=false;
$.ajax( {
async : true,
url : 'someurl',
dataType : 'json',
beforeSend : function(xhr) {
// pause recursiveAjax();
},
error : function(xhr, ajaxOptions, thrownError) {
// handle errors
},
success : function(data) {
//conditions
window.recurse=true;
recursiveAjax();
}
});
}
答案 1 :(得分:1)
JavaScript是一种异步语言,因此您可以像在其他注释中一样只想要回调(见上文)。但想想你的问题,大多数时候最好在网络上异步工作。你真的想要这个吗?
答案 2 :(得分:1)
由于您可能不希望同时使用这两个请求,请让递归方法执行其中一个。在需要导航调用时设置一个标志,让递归方法执行下一次迭代请求:
var navigationCall = false;
function recursiveAjax(){
if (navigationCall) {
navigationCall = false;
$.ajax( {
async : true,
url : 'someurl',
dataType : 'json',
error : function(xhr, ajaxOptions, thrownError) {
// handle errors
},
success : function(data) {
//conditions
recursiveAjax();
}
});
} else {
$.ajax( {
async : true,
url : 'someurl',
dataType : 'json',
beforeSend : function(xhr) {
// do stuff
},
error : function(xhr, ajaxOptions, thrownError) {
// handle errors
},
success : function(data) {
//conditions
recursiveAjax();
}
});
}
}
function navigationAjax(){
navigationCall = true;
}
注意:您可能希望添加window.TimeOut
调用来执行递归以限制对服务器的请求流。调用服务器没有必要比人眼看到更改更频繁。