【问题标题】:Reloading Ajax function with setTimeout doesnt clear previous timeout first使用 setTimeout 重新加载 Ajax 函数不会首先清除先前的超时
【发布时间】:2021-01-25 15:39:10
【问题描述】:

我正在尝试在单击联系人姓名时加载聊天框。在初始加载时,它会显示收件箱。在我再次尝试单击联系人姓名之前,所有功能都可以正常工作。它会加载新的联系人聊天,但也会显示原始联系人聊天,即使我设置了 clearTimeout()。

这里是JS文件-

$(document).ready(function(){ 
    var contactTimeout;
    var inboxTimeout;

   function contact() {
       var fromName = $('#from').val();
       var toName = $("#to").val();
       $(".chat-title").replaceWith("<div class='chat-title'>" + toName + "</div>");
       $(".chat-form").fadeIn(100);

       $.ajax('chat/get-chat.php', {
          data: ({ to: toName,from: fromName}),
          type: "POST",
          success: function(data) {
              $(".chat-body").replaceWith("<div class='chat-body'>" + data + "</div>");
              contactTimeout = setTimeout(contact, 2000);
          } 
      }); 
   }

   function inbox() {
      var user = $('#from').val();
      $.ajax('chat/get-chat-inbox.php', {
          data: ({ user: user}),
          type: "POST",
          success: function(data) {
              $(".chat-body").replaceWith("<div class='chat-body'>" + data + "</div>");
              inboxTimeout = setTimeout(inbox, 2000);
           }
       }); 
     }


     // Load inbox when chat box is opened
     $(".chat-arrow").click(function(){
         clearTimeout(contactTimeout);
         inbox();
     });

     // Load chat from contact name
     $(".contact-name").click(function() {
         clearTimeout(contactTimeout); // Here I try and kill previous timeout
         clearTimeout(inboxTimeout);
         var contactName = $(this).attr('id');
         $("#to").val(contactName);
         contact();
     });

});

为什么它只是添加更多的超时功能而不是在点击新的联系人姓名时替换它们?

【问题讨论】:

    标签: javascript jquery ajax function settimeout


    【解决方案1】:

    首先我建议您不要每次都使用替换,您可以轻松地使用.html(data) 将新数据放入聊天正文的现有内容中。

    解释是你在 ajax 成功时调用你的函数(服务器响应你的请求需要等待时间),如果你同时点击另一个调用,你将有两个调用而不是一个,因为你无法清除尚未启动的计时器。

    其中一个解决方案是,让计时器仅在其默认状态下工作,当您需要一些快速数据时,您可以呼叫您的联系人而无需呼叫下一个计时器。

    $(document).ready(function(){ 
        var contactTimeout;
        var inboxTimeout;
       
       /* add parameter which will mean will we call timer or not */
       function contact(dotimer) {
           var fromName = $('#from').val();
           var toName = $("#to").val();
           $(".chat-title").replaceWith("<div class='chat-title'>" + toName + "</div>");
           $(".chat-form").fadeIn(100);
    
           $.ajax('chat/get-chat.php', {
              data: ({ to: toName,from: fromName}),
              type: "POST",
              success: function(data) {
                  $(".chat-body").replaceWith("<div class='chat-body'>" + data + "</div>");
                  /* default calling of timer with repeating */
                  if (dotimer) { contactTimeout = setTimeout(function(){ contact(true); }, 2000); }
              } 
          }); 
       }
    
       function inbox() {
          var user = $('#from').val();
          $.ajax('chat/get-chat-inbox.php', {
              data: ({ user: user}),
              type: "POST",
              success: function(data) {
                  $(".chat-body").replaceWith("<div class='chat-body'>" + data + "</div>");
                  inboxTimeout = setTimeout(inbox, 2000);
               }
           }); 
         }
    
    
         // Load inbox when chat box is opened
         $(".chat-arrow").click(function(){
             clearTimeout(contactTimeout);
             inbox();
         });
    
         // Load chat from contact name
         $(".contact-name").click(function() {
             clearTimeout(inboxTimeout);
             var contactName = $(this).attr('id');
             $("#to").val(contactName);
             /* call function without TIMER, default one will work as it works */
             contact(false);
         });
    });
    

    【讨论】:

    • 好的,我想我正在关注,那么终止当前 setTimeout 请求的正确方法是什么?我是将 setTimeout 移到 ajax 请求之外还是将其添加到 click 函数中?
    • 我在帖子中回答,这是我脑海中浮现的一个解决方案,但它并不完美,您可以改进它。 (我还清除了您在 click 方法处 clearTimeout 的行(因为总会有一个重复计时器,而所有其他调用都没有重复计时器(一个结果调用)。
    • 啊,我明白了,谢谢,尽管使用这种方法我仍然得到相同的结果。
    • 我很抱歉,你的回答是正确的我有一些我忘记的旧代码导致了问题。谢谢老哥!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 2017-04-14
    • 2013-06-23
    • 2013-08-14
    • 1970-01-01
    相关资源
    最近更新 更多