对于每个新的ajax调用,它比前一个调用花费更多的时间

时间:2017-12-15 10:08:01

标签: ajax asp.net-mvc asp.net-mvc-4 asp.net-mvc-ajax

我正在尝试使用ajax调用更改某些数据,但问题是每个新调用都比前一个调用花费的时间多一点。

因此,在10-15次调用之后,从ajax请求开始到ajax返回数据的时间是每个请求20秒。

我也试过调试,似乎问题是当我触发ajax调用时,它会花费所有时间直到控制器检测到调用,并且在控制器检测到它之后,它会被执行并立即返回数据。

P.S。当我评论这两个间隔时,它完美地工作。所以我猜这些间隔会阻止此请求表立即发生。

Google Chrome也存在问题吗?因为我认为在微软边缘工作完美(至于我做了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');
            }
        }
    })

另外两个每1000毫秒获取数据的函数

            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);
        }
    }

1 个答案:

答案 0 :(得分:0)

我假设这两个功能并不相互依赖。

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);

我必须补充一点,这是未经测试的代码。