我在设定的时间间隔内有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);
答案 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;