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

Sending an AJAX call before all other AJAX calls

本文关键字:调用 AJAX 其他      更新时间:2023-09-26

在我的web应用程序上发送其他AJAX调用之前,我需要检查条件并运行AJAX调用。

我想把这个AJAX调用放在ajaxSetup上的beforeSend中,使用async:false(以防止我的初始调用在这个调用完成之前运行)。

类似这样的东西:

//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
            });
        }
    }
});

我在第一个AJAX调用上的beforeSend会超过ajaxSetup中的那个吗?有没有更好的方法?

我的应用程序更好的想法:

我通过应用程序进行了很多Ajax调用,每个调用都会在头上发送一个安全哈希来验证用户,这些哈希也有时间限制(哈希和时间限制都保存在localStorage中)

我想从ajax设置(以及其中的条件)中检查时间限制——如果time_limit<current_time,然后运行ajax调用来刷新用户散列。

这不是一个针对1或2个调用的练习,我的应用程序上确实有20多个正在增长的Ajax调用,这些调用利用了用户哈希,对其中的每一个进行检查是非常不切实际的。

更新:

在设置"会话"/本地存储的间隔上有一种方法

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
}

旧:

你能在准备函数中使用一些逻辑来选择你需要做的事情吗?

因此,基本上调用一个ajax调用->如果为false,只需调度后一个方法,否则运行setup一个,并在完成时调度后一种方法。

一些伪代码:

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调用。

在传入给定的查询选项之前,尝试覆盖$.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/

我建议使用.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这是一种不推荐使用的做法,它会阻塞浏览器