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

Javascript 在所有其他AJAX调用之前发送AJAX调用,javascript,jquery,ajax,Javascript,Jquery,Ajax,在我的web应用程序上发送其他AJAX调用之前,我需要检查条件并运行AJAX调用 我正在考虑使用async:false在ajaxSetup上的beforeSend中将此AJAX调用放在中(以防止在完成此调用之前运行我的初始调用) 大概是这样的: //I set an event that fires: $.ajax({ type: "GET", url: my_url, beforeSend: function() { //do something, li

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

我正在考虑使用async:false在ajaxSetup上的beforeSend中将此AJAX调用放在中(以防止在完成此调用之前运行我的初始调用)

大概是这样的:

//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设置(以及其中的条件)中检查时间限制——如果时间限制<当前时间,则运行ajax调用以刷新用户哈希

这不是一次或两次调用的练习,我的应用程序上有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
}
旧的:

您能在ready函数中使用一些逻辑来决定您需要做什么吗

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

一些伪代码:

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是通过心跳来实现这一点的,我在web应用程序中使用了这种逻辑和一些“锁定”功能。如果您正确地安排了时间间隔,它就不会中断任何其他ajax调用。

我建议使用
.done()
$.Deferred
对象


避免使用
async:false
这是一种不推荐使用的做法,它会阻塞浏览器

尝试覆盖$.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
    }
  });

}

这里有一个小提琴来演示:

有什么原因不能在初始页面加载时处理初始ajax调用的功能吗?在再次阅读该问题后,我删除了以前的注释:)我发现您已经在发送每个请求的用户身份验证凭据。考虑到这一点,通过允许客户端在不重新登录的情况下不断请求新的身份验证令牌,您在安全方面获得了什么好处?在我看来,使用这种设计,您已经在回避使用过期代币可能带来的任何收益。攻击者可以继续请求新的。达斯特梅森,你带来了一个有趣的观点(我不负责这个“刷新哈希”的想法),哈希持续24小时,为了验证用户,我们通过电子邮件和密码发送他的登录凭据,我们将其存储在localStorage中(同样,我不是最大的粉丝,不是我真正控制的),这将验证用户并返回一个新的哈希。我离建议使用SSL还有一步之遥(不完全确定我们是否可以在Phonegap中实现这一点),只需使用一个根本不刷新的哈希。。。可能只有在重新登录或其他情况下才会出现一次。此外,考虑刷新应用程序简历上的哈希值(我认为没有人在屏幕上运行应用程序24小时…@JoaoFerreira我同意DustMason的观点,这似乎是一个设计缺陷,我只是提供了一个破解方法,但SSL是一个更好的选择,PG也不太坏。如果你有有效的证书。。我知道您正在处理一些外部限制,但我要说的是,以纯文本形式存储用户凭据,然后每天通过未加密的线路发送这些凭据的应用程序是不安全的(并且会违反大多数商业API的规则!)。如果您无法回避其他问题,则必须使用SSL。如果您正在使用的API也允许类似OAuth的东西,那么您可以完全回避这个问题!
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
    }
  });

}