2014-04-14 186 views
0

嗨我困在我的setTimeout函数。我想要做的是循环我的setTimeout我的检索对话函数..我已经尝试了setInterval这个,但使用setInterval是一个坏消息我的应用程序,这就是为什么我切换到setTimeout ..但我似乎无法弄清楚如何再次让setTimeout的工作及其加载完成后..这里是我到目前为止,仍然试图努力使其在目前工作..Jquery/ajax循环SetTimeout

的Javascript:

id = setTimeout(function() 
{ 
    $.ajax(
    { 
     url: "includes/handlechat.php", 
     type: "GET", 
     data: data, 
     dataType: 'json', 
     success: function(result) 
     { 
      $("#clog").empty(); 
      $.each(result, function(rowKey, row) 
      { 
       $("#clog") 
        .append('<p ><h4>'+ row.username +':</h4>' + row.message_content + '</p>'); 
      }); 
     }, 
     complete: function() 
     { 
      clearTimeout(id); 
     } 
    }) 
}, 1101); 

任何提示或建议?

+0

这个脚本在setInterval FYI没有错误或只有这样的错误,我发现它对我的主要问题是微不足道的=)) –

+0

仅供参考,只有在多次调用'setTimeout'之前需要'clearTimeout'第一个完成,并且你想要防止延迟代码的多次执行。 –

+1

使用setinterval可能很糟糕 - 您最终可能会同时将多个调用排队到handlechat.php(由于延迟响应服务器负载)。在这种情况下,通过将更多请求排入已经超负荷的服务器,您正在向着火燃烧。使用setTimeout调用沿着你提出的路线走一会更好。 – Paul

回答

6

将代码放在一个函数并调用它的成功或完整的处理程序:

function load() { 
    setTimeout(function() { 
     $.ajax({ 
      url: "includes/handlechat.php", 
      type: "GET", 
      data: data, 
      dataType: 'json', 
      success: function (result) { 
       $("#clog").empty(); 
       $.each(result, function (rowKey, row) { 
        $("#clog").append('<p ><h4>' + row.username + ':</h4>' + row.message_content + '</p>'); 
       }); 
      }, 
      complete: load 
     }); 
    }, 1101); 
} 
load(); 

您也可以使用IIFE避免创建在当前环境中的另一绑定:

(function load() { 
    // setTimeout here 
}()); 
+1

如果ajax调用暂时失败,则不会调用成功,并且循环将停止。我建议交换使用$ .ajax中的xhr return,并使用.done()来处理数据,使用.always()来再次启动循环。 – Paul

+0

是真实的,将呼叫移至'完成'是有意义的。 –

+0

嗨我已经试过你的代码建议,它的工作和加载聊天对话..但我当我尝试从我的用户界面中点击其他用户时,它加载该用户的对话,然后恢复到第一位用户的谈话,现在他们都加载交替..是代码之所以成为这样的原因? –

2

我会做这样的事情。

function getChatMessages() { 
    $.ajax({ 
     // your params here 
    }).done(function (data) { 
     // do something with the data 
    }).always(function() { 
     window.setTimeout(getChatMessages, 1101); 
    }); 
} 

getChatMessages(); 

目的的”。总是是这样你就不会得到提取的消息,打破你的循环某些错误(超时,某种500等)。