加速了ajax/javascript,目前检索数据时滞后太多.必须有更好的方法


Speeding up ajax/javascript, currently too much lag when retrieving data. There has to be a better way

我使用ajax请求用用户填写的数据填充模式弹出窗口。弹出窗口只是我用jquery显示/隐藏的div布局。这个过程肯定会有一些延迟。因为让弹出窗口等待数据被检索到会中断用户流程,因为等待某件事发生只需4秒。所以我打开弹出窗口,然后调用ajax。数据填充时会有几秒钟的滞后时间。我也不确定预填充数据是否有意义,因为根据用户的操作,可能会有很多不同的数据组合。被调用的查询都相当简单。

我知道必须有更好的方法来做到这一点。我知道,每次我需要检索数据时,都会进行几个调用,而不是使用健壮的类定义在一个调用中返回所有内容,这并没有帮助。但是通过了这个,我不知道该怎么做。

这是众多例子中的一个。我会这样调用ajax:

openPopup();
            Ext.Ajax.Request({
                action: 'retrieve_last_config',
                stage_id: stage_id,
                success_fn: function(response) {
                    Ext.each(response.config_data, function(result) {
                        if(result != null) {
                            $('#stage-due-date').html(result.date_due);
                            $('#stage-email-body').html(result.email_body);
                        }
                    });
                }
            }); //end ajaxRequest

上面是向如下函数传递一个id:

function retrieve_last_config($request) {
$last_config = stage_config::getLatest($request->db, "WHERE stage_id='{$request->stage_id}'");
foreach ( $last_config as $config ) {
    $config_data[] = array(
        'id' => $config->id,
        'stage_id' => $config->stage_id,
        'template_id' => $config->template_id,
        'date_due' => convertDateFormat($config->date_due),
        'email_body' => $config->email_body,
        'send_email' => $config->send_email,
        'create_date' => convertDateFormat($config->create_date),
    );
}
return json_encode(array('status' => 'OK', 'config_data' => $config_data));
}

我很乐意更深入地研究类定义等。但我认为这会给我足够的想法。我是不是离基地太远了?感谢您的帮助!

高级方法很好。对于性能问题,您可以从开始测量花费的时间。如果没有这些细节,我们都可以推测,但无论如何,你都想实际衡量这一切。

您想回答的问题:

  • 在服务器上检索数据花费了多少时间
  • 做json_encode花了多少时间
  • 有多少数据正在传输
  • 这需要多长时间

回答这些问题,你就会知道该解决什么问题。

您首先必须确定延迟的位置。使用浏览器调试器,如Firebug,打开NET选项卡并启动AJAX调用。您需要确定延迟是在提取还是在渲染中。

您可能需要优化数据库索引,但直到您看到延迟在哪里,您才会知道。

首先查找每个操作的时间统计信息。

  • 如果你使用任何js循环,那么"for each"循环比正常的"for loop"慢,你可能想看看这个http://jsperf.com/jquery-each-vs-for-loop/73
  • 此外,当您拥有填充模式窗口的数据和逻辑时,请尝试使用类似setTimeout('insertRow()',0);的setimeout,这将添加对浏览器事件循环的调用,并稍微提高性能。-此外,如果要提取大量数据,那么您可能可以延迟批量加载数据
  • 此外,您还可以缓存通过ajax获取的数据
  • 你也可以尝试使用网络套接字,因为它们速度更快,但看看它们是否最适合你的场景