在所有其他AJAX调用之前发送AJAX调用

时间:2013-07-06 16:09:01

标签: javascript jquery ajax

我需要检查一个条件并在我的网络应用程序上发送其他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调用,这些调用使用了用户哈希值,并且对每个调用都进行检查是非常不切实际的。

3 个答案:

答案 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这是一种弃用的做法,而且它会阻碍浏览器