** ANGULAR 1.X ** 大家好!我需要帮助使这个$ http.get函数异步,正如你从代码中看到的,我当前的临时解决方案是setInterval的displayData范围。这显然不是一种有效的解决方案,因为它占用了太多的CPU,太多的用户数据并且可能导致UI上的一些闪烁。我希望在更新数据库时更新数组。 请不要建议我切换到其他框架。 谢谢
$scope.displayData = function() {
$http.get("read.php").success(function(data) {
$scope.links = data;
});
}
setInterval(function(){$scope.displayData();}, 500);
这是我的PHP(" read.php")
<?php
include("../php/connect.php");
session_start();
$output = array();
$team_id = $_SESSION['team_id'];
$sql = "SELECT record_id, user_id, link, note, timestamp FROM
link_bank WHERE team_id = '$team_id' AND status = 'valid'";
$result = mysqli_query($connect, $sql);
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_array($result)) {
$output[] = $row;
}
echo json_encode($output);
}
?>
答案 0 :(得分:1)
$http.get
已异步!异步函数只是在将来某个未知时间内完成运行的任何函数。
你真正想要做的是long polling。这是您定期向服务器发送请求以获取最新数据的地方,并且有几个原因导致它不是一个好主意(包括您所说的闪烁和高CPU使用率)。
我知道你说你不希望任何人建议其他框架,但是尝试编写自己的框架,在数据库更新时通知客户端是一项艰巨的任务。我们可以为您提供简短的代码片段,仅通过PHP和Javascript为您提供该功能。
但是,您可以尝试使用WebSockets滚动自己的代码。这是以您建议的方式进行服务器到客户端通信的最直接,非框架方式。
答案 1 :(得分:0)
检查调试工具的一些细节,有大量网络请求需要很长时间而且没有返回任何新数据。
使用时间线记录获取有关客户端处理的一些详细信息。
在我看到的观点中,客户方并没有遭受太多苦难,但没有数据,很难真正评估。
您可以通过获取时间轴然后放大记录数据的一部分来查看实际功能的调用时间和花费的时间。还有很好的扩展用于检查角度
中的$ watchershttps://chrome.google.com/webstore/detail/angular-watchers/nlmjblobloedpmkmmckeehnbfalnjnjk?hl=en
如果绑定只更新一次(在ng-repeats中多次使用),您可以使用{{::bindOnce}}
语法来减少观察者数量。这有助于减少消化时间,因为需要检查更少的观察者的变化。如果你有一个很长的元素列表(1000s),那么使用某种虚拟滚动器或分页UI组件有助于避免在DOM中每行元素生成1000 *个元素。
在服务器端,您可以使用xdebug插件/模块从服务器端收集分析数据,并可以使用kcachegrind来评估该数据以查找服务器花费最多时间的位置,但也可以使用某种服务器如果没有任何改变,可以避免不断地访问数据库(可能会考虑使用Redis或查看memcached来加速那些服务器端的事情,或者看看它是否仅仅是网络延迟)。
更改语言或框架而不进行实际剖析以获取究竟速度慢的数据并不是一个很好的举动IMO只会在新的热点之间跳跃而不理解为什么或是否重要。
以下示例来自PHP脚本的相对快速的响应。除了吐出硬编码的JSON响应之外,它基本上什么也没做,使用Redis或memcached来获取响应特别是空响应没有太多额外开销。