多个ajax调用和太多并发进程

时间:2015-04-15 13:49:13

标签: jquery ajax

我在设定的时间间隔内有3个ajax调用,因此他们会在后台定期更新用户通知。我不得不最近禁用它,因为它导致了太多并发进程并在我们的共享主机上杀死了该网站。

我喜欢下面的功能,但我想知道我是否可以以更经济的方式执行此操作,例如将它们嵌入回叫中。所以一个人在下一次开始之前完成。

问题是,定期进行多次ajax调用的最佳方法是什么?

 setInterval(function() {
        // check who is online
        $(".whosOnline").load("ajax/whosOnline.php", function(data) {});
        // check for new messages
        $.ajax({
            url: 'ajax/message-count.php',
            type: "POST",
            success: function(data) {
                $(".MessageCountContainer").html(data);
            }
        });
        // check for new notifications
        $.ajax({
            url: 'ajax/notification-count.php',
            type: "POST",
            success: function(data) {
                $(".NotificationCountContainer").html(data);
            }
        });
    }, 15000);

2 个答案:

答案 0 :(得分:1)

您可以在前一个回调中调用下一个ajax请求,如下所示:

setInterval(function() {
        // check who is online
        $(".whosOnline").load("ajax/whosOnline.php", function(data) {
            // check for new messages
            $.ajax({
                url: 'ajax/message-count.php',
                type: "POST",
                success: function(data) {
                    $(".MessageCountContainer").html(data);
                    // check for new notifications
                    $.ajax({
                        url: 'ajax/notification-count.php',
                        type: "POST",
                        success: function(data) {
                            $(".NotificationCountContainer").html(data);
                        }
                    });
                }
            });     
        });
}, 15000);

但是,我认为将服务器端的三个调用连接在一起并将结果放在json格式中更容易,更有效。 然后客户端可以像这样使用它:

setInterval(function() {
    $.ajax({
        url: 'ajax/get-all-notification.php',
        type: "POST",
        dataType : "json",
        success: function(data) {
            $(".MessageCountContainer").html(data.MessageCountContainer);
            $(".NotificationCountContainer").html(data.NotificationCountContainer);             
        }
    });
}, 15000);

答案 1 :(得分:0)

尝试

var timeout = null;
var _notifications = true;
// check who is online
var a = function() {
  return $(".whosOnline").load(url, function(data) {}).promise()
};
// check for new messages
var b = function() {
  return $.ajax({
    url: url,
    type: "POST",
    success: function(data) {
      $(".MessageCountContainer").html(data);
    }
  })
};
// check for new notifications
var c = function() {
  return $.ajax({
    url: url,
    type: "POST",
    success: function(data) {
      $(".NotificationCountContainer").html(data);
    }
  })
};

var count = 0;

var notifications = function notifications() {    
  return $.when(a()).then(b).then(c).then(function() {
    ++count;
    console.log(count);
    // stop `notifications`
    // if (count === 5) {
    //  clearTimeout(timeout);
    //  _notifications = false;
    // };
    timeout = setTimeout(function() {
      if (_notifications !== false) {
          notifications()
      };
    }, 15000)
  })    
};

notifications();



var timeout = 0;
var _notifications = true;

var url = "https://gist.githubusercontent.com/guest271314/6a76aa9d2921350c9d53/raw/49fbc054731540fa68b565e398d3574fde7366e9/abc.txt";

    // check who is online
    var a = function() {
      return $(".whosOnline").load(url, function(data) {}).promise()
    };
    // check for new messages
    var b = function() {
      return $.ajax({
        url: url,
        type: "GET",
        success: function(data) {
          $(".MessageCountContainer").html(data);
        }
      })
    };
    // check for new notifications
    var c = function() {
      return $.ajax({
        url: url,
        type: "GET",
        success: function(data) {
          $(".NotificationCountContainer").html(data);
        }
      })
    };

    var count = 0;
    var notifications = function notifications() {

      return $.when(a()).then(b).then(c).then(function() {
        ++count;
        console.log(count);
         if (count === 5) {
          clearTimeout(timeout);
          _notifications = false;
         };
        timeout = setTimeout(function() {
          if (_notifications !== false) {
              notifications()
          };
        }, 15000)
      })

    };
    notifications();

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="whosOnline"></div>
<div class="MessageCountContainer"></div>
<div class="NotificationCountContainer"></div>
&#13;
&#13;
&#13;