使用jQuery和AJAX进行长轮询的正确方法是什么

我有一个涉及实时通知的项目。 所以我偶然发现使用socket io,但我还没有足够的时间来学习它。 所以我尝试用AJAX和jQuery来做。 下面是我的代码结构,我想知道这是否会没有缺点?

setInterval(function(){ if( !element.hasClass('processing') ){ element.addClass('processing'); $.ajax({ type: 'post', dataType: 'json', url: ajaxurl, data: {}, success: function( response ){ /* Success! */ element.removeClass('processing'); } }); } }, 2500); 

一些额外的信息

你描述的方式将起作用。 根据经验,我想指出一些事情。

  • 我通常做一个递归函数,允许你等待ajax调用之间的间隔而不是固定速率。 //可选但是给服务器一些呼吸室。

  • 使用带有isActive标志的window.setTimeout()。 //允许您停止投票,无论原因是什么,并且因为如果需要,function会再次启动

  • 为了彻底清醒,我发现处理$ .ajax()post的错误情况总是一个好主意。 您可能会显示一些消息,告诉用户他不再连接到互联网等。

一些示例代码:

 var isActive = true; $().ready(function () { //EITHER USE A GLOBAL VAR OR PLACE VAR IN HIDDEN FIELD //IF FOR WHATEVER REASON YOU WANT TO STOP POLLING pollServer(); }); function pollServer() { if (isActive) { window.setTimeout(function () { $.ajax({ url: "...", type: "POST", success: function (result) { //SUCCESS LOGIC pollServer(); }, error: function () { //ERROR HANDLING pollServer(); }}); }, 2500); } } 

注意

这只是我使用你使用的确切方法选择的一些东西,似乎Web套接字可能是更好的选择,我将在不久的将来深入研究它。

请参考: Jquery:Ajax:如何在开始之前显示加载对话框并在关闭之后关闭?

我希望这可以帮到你

 $("div.add_post a").click(function(){ var dlg = loadingDialog({modal : true, minHeight : 80, show : true}); dlg.dialog("show"); $.ajax({ url : "/add.php", complete : function (){ dlg.dialog("hide"); } }); return false; }); //--Loading dialog function loadingDialog(dOpts, text = "пожалуйста подождите, идет загрузка...") { var dlg = $("
загрузка "+text+"
").dialog(dOpts); $(".ui-dialog-titlebar").hide(); return dialog; }