我需要检查一个条件并在我的网络应用程序上发送其他AJAX调用之前运行一个AJAX调用。
我正在考虑将此AJAX调用放在 ajaxSetup 的 beforeSend 上,并使用async:false(以防止我的初始调用在此完成之前运行)。< / p>
这样的事情:
//I set an event that fires:
$.ajax({
type: "GET",
url: my_url,
beforeSend: function() {
//do something, like show a spinner loader gif
}
});
//Somehwere in my app I also have:
$.ajaxSetup({
beforeSend: function() {
if(x===1){
$.ajax({
type: "GET",
url: my_url/fetch_something,
async:false
});
}
}
});
我的firstSend在第一次AJAX调用中是否会超出ajaxSetup中的那个?有没有办法更好地接近这个?
更好地了解我的应用:
我通过应用程序进行了大量的Ajax调用,每次调用都会在标头上发送安全散列来验证用户,这些散列也有时间限制(散列和时间限制都保存在localStorage中)
我想从ajax设置(及其中的条件)中检查时间限制 - 如果time_limit&lt; current_time比运行ajax调用刷新用户哈希。
这不是1或2次调用的练习,我的应用程序上有20多个不断增长的Ajax调用,这些调用使用了用户哈希值,并且对每个调用都进行检查是非常不切实际的。
答案 0 :(得分:2)
更新:
在设置'session'/ local-storage
的时间间隔内设置一种方法var refreshing = false;
var intervalID;
$(document).ready(function(e){
var delay = 1234;
intervalID = window.setInterval(setupInterval, delay);
});
function setupInterval(){
refreshing = true;
$.ajax(URL).done(function(r) { //do stuff
setupStorage(r);
refreshing = false;
});
}
function setupStorage(info){
//setup whatever here
}
OLD:
你能否在准备好的函数中使用一些逻辑来处理你需要做的事情?
所以基本上叫一个ajax调用 - &gt;如果为false,则只安排您的后一种方法,否则运行安装程序,并在完成计划中运行后一种方法。
一些伪代码:
var refresh = false;
$(document).ready(function(e){
$.ajax(URL).done( function(r) {
if(r) {
routeOne();
} else {
latter();
}
});
});
function routeOne(){
$.ajax(URL).done(function(r) { //do stuff
latter();
});
}
function latter(){
//All other ajax calls
}
我会更加深思熟虑,让我先喝完咖啡......
编辑:
根据您更新的说明,您可以安排setInterval在您需要的时间间隔上运行检查方法/哈希更新,并且您的服务器上的时间间隔是静态还是变量? Facebook通过心跳来做到这一点,我在网络应用程序中使用了这种类型的逻辑和一些“锁定”功能。如果你正确安排了间隔,它不应该中断任何其他的ajax调用。
答案 1 :(得分:1)
在传递给定的查询选项之前,尝试重写$ .ajax以进行“预调用”:
var oldAjax = $.ajax;
$.ajax = function() {
var args = arguments;
oldAjax({
type: "GET",
url: "/echo/html/",
success: function(result){
// do something here to check result
// if result is good, do the request:
return oldAjax.apply($, args);
// if its bad, handle the error
}
});
}
这是一个演示的小提琴:http://jsfiddle.net/NF76U/
答案 2 :(得分:0)
我建议使用.done()
($.Deferred
object
)
function AjaxCall() {
return //code of your ajax without async:false
}
function anotherAjaxCall{
return //code of you ajax call
}
AjaxCall.done(anotherAjaxCall);
避免使用async:false
这是一种弃用的做法,而且它会阻碍浏览器