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

时间:2016-07-07 06:14:11

标签: javascript 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);

2 个答案:

答案 0 :(得分:10)

一些额外信息

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

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

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

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

一些示例代码:

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套接字可能是更好的选择,我将在不久的将来深入探讨。

答案 1 :(得分:0)

请参阅: Jquery : Ajax : How can I show loading dialog before start and close after close?

我希望这可以帮到你

$("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 = $("<div><img src='/theme/style/imgs/busy.gif' alt='загрузка'/> "+text+"<div>").dialog(dOpts);
    $(".ui-dialog-titlebar").hide();

    return dialog;
}