0

我在一个页面上有几个 ajax 调用,远远不止几个,我的任务是减少服务器密集度。

这是代码的当前设置:

$.getJSON('charts_ajax.php',{a : 'visits', rangeStartDate : '<?=$_POST["rangeStartDate"] ?>', rangeEndDate : '<?= $_POST["rangeEndDate"] ?>'},function(data){
    //stuff
};

$.getJSON('charts_ajax.php',{a : 'terms', rangeStartDate : '<?=$_POST["rangeStartDate"] ?>', rangeEndDate : '<?= $_POST["rangeEndDate"] ?>'},function(data){
    //stuff
};
$.getJSON('charts_ajax.php',{a : 'usage', rangeStartDate : '<?=$_POST["rangeStartDate"] ?>', rangeEndDate : '<?= $_POST["rangeEndDate"] ?>'},function(data){
    //stuff
};
$.getJSON('charts_ajax.php',{a : 'content', rangeStartDate : '<?=$_POST["rangeStartDate"] ?>', rangeEndDate : '<?= $_POST["rangeEndDate"] ?>'},function(data){
    //stuff
};

这持续了 15 个其他电话。

当我监视服务器时,活动非常高。

一个接一个地加载这个并减少服务器压力的最佳方法是什么?

4

3 回答 3

0

使用 jQueries deferred.then

$.getJSON('charts_ajax.php',{a : 'visits', rangeStartDate : '<?=$_POST["rangeStartDate"] ?>', rangeEndDate : '<?= $_POST["rangeEndDate"] ?>'}).then(function(data1) {
    //stuff
    $.getJSON('charts_ajax.php',{a : 'terms', rangeStartDate : '<?=$_POST["rangeStartDate"] ?>', rangeEndDate : '<?= $_POST["rangeEndDate"] ?>'}).then(function(data2){
         //stuff
         //etc.
    };
});

或者,您可以在一些返回 Deferred 的逻辑函数中定义您的代码:

function someName() {
    return $.getJSON('charts_ajax.php',{a : 'visits', rangeStartDate : '<?=$_POST["rangeStartDate"] ?>', rangeEndDate : '<?= $_POST["rangeEndDate"] ?>'}).then(function(data1) {
        //stuff
    });
}

function someOtherName() {
    return $.getJSON('charts_ajax.php',{a : 'terms', rangeStartDate : '<?=$_POST["rangeStartDate"] ?>', rangeEndDate : '<?= $_POST["rangeEndDate"] ?>'}).then(function(data2){
         //stuff
    });
}

someName().then(someOtherName).then(etc).then(function() {
    console.log("done");
);

}

于 2013-11-13T09:39:36.400 回答
-1

$.getJSON 是一个简写的 Ajax 函数,相当于:

$.ajax(
{
  dataType: "json",
  url: url,
  data: data,
  success: success
});

并根据文档(http://api.jquery.com/jQuery.ajax/):

async (默认:true) 类型:Boolean 默认情况下,所有请求都是异步发送的(即默认设置为true)。如果您需要同步请求,请将此选项设置为 false。跨域请求和 dataType: "jsonp" 请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。从 jQuery 1.8 开始,不推荐在 jqXHR ($.Deferred) 中使用 async: false ;您必须使用成功/错误/完成回调选项而不是 jqXHR 对象的相应方法,例如 jqXHR.done() 或已弃用的 jqXHR.success()。

所以你可以这样重写:

$.ajax(
{
  dataType: "json",
  async: false,
  url: 'charts_ajax.php',
  data: {a : 'visits', rangeStartDate : '<?=$_POST["rangeStartDate"] ?>', rangeEndDate : '<?= $_POST["rangeEndDate"] ?>'},
  success: function(data)
  {
        //stuff
  };
});
于 2013-11-13T09:20:06.660 回答
-1

将其重写为单个调用/响应,并将其解析出来,这是一个猜测

于 2013-11-13T09:14:12.880 回答