AJAX 调用在获得响应并成功执行时会冻结浏览器一段时间
AJAX call freezes browser for a bit while it gets response and executes success
我正在对我的网络服务器进行AJAX调用,该调用获取了大量数据。 我展示了一个加载图像,该图像在执行 Ajax 调用时旋转,然后逐渐消失。
我注意到的是,此特定调用中的所有浏览器都会使其在大约 7 秒内无响应。 话虽如此,加载图像并没有像我在获取发生时计划的那样旋转。
我不知道这是否发生了,或者是否有办法解决,从某种意义上说,有一个 fork() 所以它做 1 件事,而我的加载图标仍然旋转。
思潮? 想法?
下面是有人想看的代码:
$("div.loadingImage").fadeIn(500);//.show();
setTimeout(function(){
$.ajax({
type: "POST",
url: WEBSERVICE_URL + "/getChildrenFromTelTree",
dataType: "json",
async: true,
contentType: "application/json",
data: JSON.stringify({
"pText": parentText,
"pValue": parentValue,
"pr_id": LOGGED_IN_PR_ID,
"query_input": $("#queryInput").val()
}),
success: function (result, textStatus, jqXHR) {
//alert("winning");
//var childNodes = eval(result["getChildrenFromTelTreeResult"]);
if (result.getChildrenFromTelTreeResult == "") {
alert("No Children");
} else {
var childNodes = JSON.parse(result.getChildrenFromTelTreeResult);
var newChild;
//alert('pText: '+parentText+"'npValue: "+parentValue+"'nPorofileID: "+ LOGGED_IN_PR_ID+"'n'nFilter Input; "+$("#queryInput").val() );
//alert(childNodes.length);
for (var i = 0; i < childNodes.length; i++) {
TV.trackChanges();
newChild = new Telerik.Web.UI.RadTreeNode();
newChild.set_text(childNodes[i].pText);
newChild.set_value(childNodes[i].pValue);
//confirmed that newChild is set to ServerSide through debug and get_expandMode();
parentNode.get_nodes().add(newChild);
TV.commitChanges();
var parts = childNodes[i].pValue.split(",");
if (parts[0] != "{fe_id}" && parts[0] != "{un_fe_id}") {
newChild.set_expandMode(Telerik.Web.UI.TreeNodeExpandMode.ServerSide);
}
}
}
//TV.expand();
//recurseStart(TV);
},
error: function (xhr, status, message) {
alert("errrrrror");
}
}).always(function () {
$("div.loadingImage").fadeOut();
});
},500);
我的一位同事注意到了这个问题,并建议我添加一个setTimeout(function(){..},500);但它不能解决手头的问题,所以它很可能会被删除。
由于 JavaScript 是单线程的,大量的同步处理会挂起事件队列并阻止其他代码执行。在您的情况下,是 for 循环在执行浏览器时锁定浏览器。
您可以尝试将所有迭代放入事件队列中。
for (var i = 0 ; i < childNodes.length ; i = i + 1) {
(function(i) {
setTimeout(function(i) {
// code-here
}, 0)
})(i)
}
这应该会间隔处理,而不是强制浏览器一次完成所有处理。自执行函数用于创建一个闭包以保留循环计数器 i 的值。
相关文章:
- 无法在通过jQuery的ajax加载的页面中执行javascript
- JavaScript执行暂时挂起页面
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 当js函数's已执行
- 在哪里使用名为“;冻结”;
- 哪个先执行
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- HTML表单提交时未执行外部函数
- 在Safari执行javascript之前对其进行修改
- Amd,希望确保某个东西总是最后执行
- 在Windows 10中自动执行例行程序(主要与浏览器交互)
- 递归使用 eval() 是检查程序执行的好方法吗?
- AJAX 调用在获得响应并成功执行时会冻结浏览器一段时间
- 仅限Chrome:ajax冻结了我的JavaScript执行
- 如何在不冻结浏览器的情况下执行大量javascript代码
- 执行流星重置时,登录用户的应用程序页面冻结
- 为什么在执行许多ajax请求时浏览器会冻结
- Internet Explorer在执行鼠标单击+拖动操作时冻结.如何检测其原因
- 加载 gif 会在代码执行时“冻结”
- jQuery $.get 冻结执行