1

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

4

3 回答 3

2

更新:

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

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,则只安排后一种方法,否则运行安装程序并在完成时安排后一种方法。

一些伪代码:

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

于 2013-07-06T16:17:14.880 回答
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/

于 2013-07-06T16:36:00.320 回答
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它是一种已弃用的做法,它会卡住浏览器

于 2013-07-06T16:24:36.163 回答