【问题标题】:Query ajax does not allow me to do more actionsJquery ajax 不允许我做更多的动作
【发布时间】:2023-03-08 22:02:01
【问题描述】:

我有一个仪表板,当用户登录时,它会显示在主屏幕上。

最初我有两个图形,一个是线条,一个是条形。问题是图形查询有点重,加载大约需要 30 秒。

我已经对查询进行了优化,并且改进了一点,问题是当我想访问系统的其他选项时并没有离开我,因为我必须等到加载图表。

用户很难等到图表加载完毕,我想知道是否有一种方法可以访问其他系统选项,而不管是否加载了图表。

我的代码如下:

/*
* You get the urls that the user has access to in the dashboard. This is executed * when the user is on the main screen.
*/
  $.getJSON(getBaseUri() + 'dashboard/index', function(data) {

    var datas  = data['return'];

    if(datas == ""){
      $productivities.removeClass('chartID');
      $productions.removeClass('chartID');
      $combox.addClass('hidden');
    }

    for (var i in datas) {
      receiveData({
        div       : datas[i].div,
        title     : datas[i].privilege,
        sign      : datas[i].sign,
        iconClass : datas[i].class,
        id        : datas[i].id,
        label     : datas[i].label,
        xaxis     : datas[i].xaxis,
        yaxis     : datas[i].yaxis,
        background: datas[i].background,
        url       : datas[i].route,
        type      : datas[i].type
      });
    }
  });

/*
   * The function receiveData () receives the parameters of the dashboard that the user has access and brings the data of each url consulted, and according to the type of graph the function is executed.
   */
  function receiveData(param) {

    $.ajax({
      url: param.url,
      method: 'GET',
      dataType: 'json',
      success: function(data){
        var datas = data['return'];

        if(param.type === "LineChart"){
          lineChart({
            data : datas,
            div  : param.div,
            title: param.title,
            url  : param.url
          });
          $loaderProduction.addClass("hidden");
        }

        if (param.type === "BarChart") {
          barCharts({
            data      : datas,
            div       : param.div,
            title     : param.title,
            url       : param.url,
            label     : param.label,
            xaxis     : param.xaxis,
            yaxis     : param.yaxis,
            background: param.background
          });
          $loaderProductivity.addClass('hidden');
        }

        if (param.type === "Indicator") {
          indicatorsChart({
            data  : datas,
            div   : param.div,
            title : param.title,
            icon  : param.sign,
            class : param.iconClass,
            idDash: param.id
          });
        }

        if (param.type === "Sowing") {
          sowingIndicator({
            data  : datas,
            div   : param.div,
            title : param.title,
            idDash: param.id
          });
        }
      },
      error: function(error){
        console.log(error);
      }
    });
  }

基本上这些是我用来显示仪表板图的函数。

我认为这种情况我需要使用WebWorkers,但我不知道如何使用它

【问题讨论】:

  • 这张图表有多少个数据点?
  • 每张图有两张图,每张图有52个点@jonmrich
  • charts.js 应该以毫秒为单位执行。我猜您的数据返回到 AJAX 的速度非常缓慢。你能检查一下吗?
  • 我知道查询有点繁重,在这个问题中我寻求帮助以改进其中一个查询 (stackoverflow.com/questions/42069953/change-query-sql) @jonmrich
  • 基于该查询,我不认为charts.js 是远程问题。您可能只需要添加一个加载图标,该图标会在数据准备好时消失。这至少会告诉用户有什么事情要发生了。

标签: javascript jquery ajax performance


【解决方案1】:

现在,您正在为 for...in 循环的每次迭代进行 AJAX 调用。根据迭代次数,这可能意味着巨大的开销,尽管在所有情况下最好减少到服务器的往返次数。

您可以尝试修改前端和后端逻辑,将多个数据集组合到一个请求中,而不是每个请求一个数据集和多个请求。

除此之外,您的代码中没有明显的瓶颈,因此如果缓慢仍然存在,问题很可能与您的后端代码有关。

【讨论】:

  • 我已经优化了代码,但我认为问题出在AJAX,我不知道是否有办法让用户访问系统菜单选项,无论加载哪些图形! @ppajer
【解决方案2】:

当然你有一些选择:

  • 通过单页应用程序,即让您的应用程序在用户浏览其他应用程序选项时始终保持在同一页面中。它可能很重,特别是如果您的应用程序已经结构化。 Angular(或 AngularJs)与其他前端框架一样,以自动化的方式为您执行此操作。

  • 让你在一个 iframe 中执行你的加载 js,它又旧又脏,但它可以工作。完成后在主页发送通知消息,

无论如何,您也应该优化您的代码,将调用次数从 n(数据中的每个元素一个)减少到 1。

【讨论】:

  • 我想我已经优化了后端的代码,但我还需要提出这些请求来加载图表@Massimo
  • 所以,试着让你的全局页面中存在的 iframe 中的 js 执行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
相关资源
最近更新 更多