2017-12-15 7 views
1

私はajax呼び出しでいくつかのデータを変更しようとしていますが、新しい呼び出しごとに前回の呼び出しより少し時間がかかります。新しいAJAX呼び出しごとに前の呼び出しより少し時間がかかります

したがって、10-15回の呼び出しの後、ajax要求が開始されてからajaxがデータを返すまでの時間は、要求ごとに20秒になります。

また、デバッグしようとしましたが、問題は、私がajax呼び出しをトリガーすると、コントローラが呼び出しを検出してコントローラがそれを検出してからすぐにデータを返すまで。

P.S.私はこれらの2つの間隔をコメントアウトすると、それは完全に動作します。だから私はこれらの間隔がすぐに起こってこのリクエストフォームをブロックしていると思います。

Google Chromeでも問題がありますか?私はMicrosoft Edgeで完璧に動作すると思うから(遠くには2回テストしました)。

HTML:

<div class="table-responsive"> 
<table class="table table-condensed table-hover usersTable"> 
    <thead> 
     <tr> 
      <th style="width: 20%">Benutzer</th> 
      <th></th> 
      <th></th> 
      @foreach (var item in Model.Skills) 
      { 
       <th title="@item.Name">@item.ShortName</th> 
      } 
      <th class="text-center">Extension</th> 
      <th class="text-center">Total Calls</th> 
      <th class="text-center">Calls per hour</th> 
      <th class="text-center">Average Call Duration</th> 
     </tr> 
    </thead> 
    <tbody class="usersTableBody"></tbody> 
</table> 
<div class="col-md-12 text-center noSignedInUser" style="display: none;"> 
    <h4 style="color: lightgrey">There is no signed in user</h4> 
</div> 

JS:

$(function() { 
     $('.usersTableBody').on('click', '.hasSkill', function() { 

      var userId = $(this).parent().data('id'); 
      var skillId = $(this).data('id'); 

      if ($(this).hasClass('skillIsActive')) { 
       addRemoveSkill(userId, skillId, false, $(this)) 
      } 
      else { 
       addRemoveSkill(userId, skillId, true, $(this)) 
      } 
     }); 

     //add or remove a skill to a user with ajax 
     function addRemoveSkill(userId, skillId, add, element) { 
      $.ajax({ 
       url: '@Url.Action("AddRemoveSkill","Home")', 
       data: { userId: userId, skillId: skillId, add: add }, 
       success: function (data) { 
        if(data == true) { 
         if (add == false) 
         { 
          $(element).addClass('skillIsInactive') 
          $(element).removeClass('skillIsActive') 
         } 
         else { 
          $(element).addClass('skillIsActive') 
          $(element).removeClass('skillIsInactive') 
         } 
         $(element).addClass('recentlyUpdated'); 
         hasAllSkillsDisabled($(element)); 
        } 
       } 
      }); 
     } 


     function hasAllSkillsDisabled(element) { 

      parent = $(element).parent(); 
      var hasAllDisabled = true; 

      $.each(parent.children('td'), function (i, item) { 
       if ($(item).hasClass('skillIsActive')) 
       { 
        hasAllDisabled = false; 
       } 
      }); 

      if (hasAllDisabled == true) 
      { 
       $(parent).addClass('hasAllSkillsDisabled'); 
      } 
      else { 
       $(parent).removeClass('hasAllSkillsDisabled'); 
      } 
     } 
    }) 

二つの他の機能のデータごとに1000msの

  getUserDatas(); 
      getSkillHeader(); 

      var detectClass = 0; 

      function getUserDatas() { 
       var type = $('#Type').val(); 
       var skill = $('#Skill').val(); 
       $.ajax({ 
        url: '@Url.Action("GetUsersDataWithAjax", "Home")', 
       data: { type: type, skill: skill }, 
       success: function (data) { 
       if (data.length == 0) { 
        $('.noSignedInUser').show(); 
       } 
       else { 
        $('.noSignedInUser').hide(); 
       } 
       if (data != false) { 

        $.each(data, function (i, item) { 

         var tr = $('tr[data-id="' + item.Id + '"].agentTr'); 

         //if that row already exists or its new 
         if (!tr.length) 
         { 
          //if new create html and append to table body 
          var dontHaveSkills = "dontHaveSkills"; 
          if (item.hasSkills) { 
           dontHaveSkills = ""; 
          } 
          var hasAllSkillsDisabled = ""; 
          if (item.hasSkills && item.HasAllSkillsDisabled) { 
           hasAllSkillsDisabled = "hasAllSkillsDisabled"; 
          } 

          var html = ''; 
          html += '<tr data-id="' + item.Id + '" class="agentTr ' + dontHaveSkills + ' ' + hasAllSkillsDisabled + ' time' + detectClass + '">'; 
          html += '<td>' + item.Name + '</td>'; 
          html += '<td class="stateName"><div class="text-right ' + item.State.NameClass + '">' + item.State.Name + '</div></td>'; 
          html += '<td class="stateCircle"><div class="statusCircle ' + item.State.CircleClass + '"</div></td>'; 

          $.each(item.Skills, function (j, skill) { 
           var klasa = ""; 
           if (skill.IsActive == true) { 
            klasa = "hasSkill skillIsActive"; 
           } 
           else if (skill.IsActive == false) { 
            klasa = "hasSkill skillIsInactive"; 
           } 
           else { 
            klasa = "unableSkill"; 
           } 

           html += '<td data-id="' + skill.Id + '" class="' + klasa + '" title="' + skill.Name + '">' + skill.ShortName + '</td>'; 

           if (j == 25) { 
            return false; 
           } 
          }); 

          html += '<td class="text-center extension">' + item.Extension + '</td>'; 
          html += '<td class="text-center totalCalls">' + item.AvgCalls.TotalCalls + '</td>'; 
          html += '<td class="text-center callsPerHour">' + item.AvgCalls.CallsPerHour + '</td>'; 
          html += '<td class="text-center avgCallDuration">' + item.AvgCalls.AvgCallDuration + '</td>'; 

          html += '</tr>'; 

          $('.usersTableBody').append(html); 
         } 
         else { 
          //else if its existing update datas 
          tr.removeClass('dontHaveSkills hasAllSkillsDisabled'); 

          var detect = 'time' + (detectClass - 1); 
          tr.removeClass(detect); 

          if (!item.hasSkills) { 
           tr.addClass('dontHaveSkills'); 
          } 
          if (item.hasSkills && item.HasAllSkillsDisabled) { 
           tr.addClass('hasAllSkillsDisabled'); 
          } 


          var stateName = tr.children('.stateName'); 
          stateName.children('div').text(item.State.Name); 
          stateName.children('div').removeClass('bereitName besetzName nbzName pauseName abgemeldetName'); 
          stateName.children('div').addClass(item.State.NameClass); 

          var stateCircle = tr.children('.stateCircle'); 
          stateCircle.children('div').removeClass('Online OnCall AfterTime Pause LoggedOff'); 
          stateCircle.children('div').addClass(item.State.CircleClass); 

          $.each(item.Skills, function (j, skill) { 

           var skillElement = tr.children('td[data-id="' + skill.Id + '"]'); 

           if (!skillElement.hasClass('recentlyUpdated')) { 
            skillElement.removeClass('hasSkill skillIsActive skillIsInactive unableSkill'); 

            if (skill.IsActive == true) { 
             skillElement.addClass('hasSkill skillIsActive'); 
            } 
            else if (skill.IsActive == false) { 
             skillElement.addClass('hasSkill skillIsInactive'); 
            } 
            else { 
             skillElement.addClass('unableSkill'); 
            } 
           } 
           else { 
            skillElement.removeClass('recentlyUpdated'); 
           } 

           if (j == 25) { 
            return false; 
           } 
          }); 


          var extension = tr.children('.extension'); 
          var totalCalls = tr.children('.totalCalls'); 
          var callsPerHour = tr.children('.callsPerHour'); 
          var avgCallDuration = tr.children('.avgCallDuration'); 

          extension.text(item.Extension); 
          totalCalls.text(item.AvgCalls.TotalCalls); 
          callsPerHour.text(item.AvgCalls.CallsPerHour); 
          avgCallDuration.text(item.AvgCalls.AvgCallDuration); 

          tr.addClass('time' + detectClass); 
         } 

         var allTr = $('tr.agentTr'); 

        }); 

       } 

       $('tr.agentTr').each(function (i, item) { 
        if (!$(item).hasClass('time' + detectClass)) { 
         item.remove(); 
        } 
       }); 
       detectClass++; 
       $('.usersTable').waitMe('hide'); 
       } 
      }); 
      } 


      function getSkillHeader() { 
       $.ajax({ 
        url: '@Url.Action("GetSkillHeaderWithAjax", "Home")', 
        success: function (data) { 
         if (data.length == 0) { 
          $('.allSkillsHidden').show(); 
         } 
         else { 
          $('.allSkillsHidden').hide(); 
         } 

         if (data != false) { 

          $.each(data, function (i, item) { 

           var tr = $('tr[data-id="' + item.Id + '"].skillTr'); 

           if (!tr.length) { 
            var html = ''; 

            html += '<tr data-id="' + item.Id + '" class="skillTr">'; 

            html += '<th class="name">' + item.Name + '</th>'; 
            html += '<th class="text-center waitingQueue">~</th>'; 
            html += '<th class="text-center activeCalls">~</th>'; 
            html += '<th class="text-center totalFreeAgents">' + item.TotalFreeAgents + '</th>'; 
            html += '<th class="text-center totalSignedInAgents">' + item.TotalSignedInAgents + '</th>'; 

            html += '</tr>'; 

            $('.skillsHeaderTableBody').append(html); 
           } 
           else { 

            var name = tr.children('.name'); 
            name.text(item.Name); 


            var totalFreeAgents = tr.children('.totalFreeAgents'); 
            totalFreeAgents.text(item.TotalFreeAgents); 

            var totalSignedInAgents = tr.children('.totalSignedInAgents'); 
            totalSignedInAgents.text(item.TotalSignedInAgents); 
           } 

          }); 
         } 
         $('.skillHeaderTable').waitMe('hide'); 
        } 
       }); 
      } 
     //call getUserDatas method every 1 seconds 
     setInterval(function() { 
      getUserDatas(); 
     },1000); 

     setInterval(function() { 
      getSkillHeader(); 
     }, 1000); 

C位を取得:

public ActionResult AddRemoveSkill(string userId, string skillId, bool add) 
    { 
     try 
     { 
      var skill = _sysCfgContext.GetUserSkill(Guid.Parse(userId), Guid.Parse(skillId)); 

      if (add) 
       skill.IsActive = true; 
      else 
       skill.IsActive = false; 

      _sysCfgContext.EditUserSkill(skill); 
      _sysCfgContext.SaveChanges(); 

      return Json(true, JsonRequestBehavior.AllowGet); 
     } 
     catch (Exception ex) 
     { 
      return Json(false, JsonRequestBehavior.AllowGet); 
     } 
    } 
+0

あなたのソースコードを共有してください。私たちはそれを見て、問題を解釈することができます –

+0

必要なクライアントとサーバー側のコードを共有できますか? –

+0

@alaa_sayeghコードを追加しました。 –

答えて

0

私はこれらの2つの関数が互いに依存しないという前提を使用しています。

function getUserDatas() { 
    var type = $('#Type').val(); 
    var skill = $('#Skill').val(); 
    return $.ajax(function() { 
    //Code omitted for brevity 
    }); 
} 

function getSkillHeader() { 
    return $.ajax(function() { 
    //Code omitted for brevity 
    }); 
} 


getUserDatas(); 
getSkillHeader(); 

var interval = setInterval(function(){ 
    $.when(getUserDatas(), getSkillHeader()) 
     .then(function(resultUserDatas,resultSkillHeader) 
},1000); 

これはテストされていないコードです。

+0

それは 'onclick'と同じですが、リクエストごとに実行時間が増え続けます。 –

+0

何とか問題を特定する必要があります。複数のgetUserDatas()関数または複数のgetSkillHeader()を試してみてください。 –

+0

複数の機能をお使いの場合、どういう意味ですか?私が考えることは、これらの2つの機能が、他の要求が起こっていることをブロックしているということです。なぜなら、それらの間隔をコメントすると、onclickはできるだけ速く起こるからです。 –

関連する問題