Javascript 为什么不是';这段代码不是同步执行的吗?
我的印象是所有DOM操作都是同步的 然而,这段代码并没有像我期望的那样运行Javascript 为什么不是';这段代码不是同步执行的吗?,javascript,jquery,dom,asynchronous,sync,Javascript,Jquery,Dom,Asynchronous,Sync,我的印象是所有DOM操作都是同步的 然而,这段代码并没有像我期望的那样运行 RecordManager.prototype._instantiateNewRecord = function(node) { this.beginLoad(); var new_record = new Record(node.data.fields, this); this.endLoad(); }; RecordManager.prototype.beginLoad = function() {
RecordManager.prototype._instantiateNewRecord = function(node) {
this.beginLoad();
var new_record = new Record(node.data.fields, this);
this.endLoad();
};
RecordManager.prototype.beginLoad = function() {
$(this.loader).removeClass('hidden');
};
RecordManager.prototype.endLoad = function() {
$(this.loader).addClass('hidden');
};
Record
构造函数非常大,它需要实例化一大堆字段
对象,每个对象实例化自己的一些其他对象
这会导致1-2秒的延迟,我希望在此延迟期间有一个加载图标,这样页面看起来就不会冻结
我预计活动流程如下:
- 显示加载图标
- 执行记录实例化操作
- 隐藏加载图标
- 执行记录实例化操作
- 显示加载图标
- 隐藏加载图标
所以,你根本看不到加载图标,我只知道它的加载很简单,因为chrome开发工具DOM查看器中的更新有点滞后
我应该从我的代码中期待这种行为吗?如果是,原因是什么?是的,这是意料之中的。虽然DOM可能已更新,但在浏览器有机会重新绘制之前,您将无法看到它。重新绘制将以与浏览器中所有其他内容排队相同的方式排队(即,在当前JavaScript块完成执行之前,重新绘制不会发生),但在调试器中暂停通常会允许重新绘制 在您的情况下,您可以使用带有即时超时的
setTimeout
来修复它:
RecordManager.prototype._instantiateNewRecord = function(node) {
this.beginLoad();
setTimeout(function() {
var new_record = new Record(node.data.fields, this);
this.endLoad();
}, 0);
};
这将允许在执行代码的下一部分之前进行重新绘制。是的,这是意料之中的。虽然DOM可能已更新,但在浏览器有机会重新绘制之前,您将无法看到它。重新绘制将以与浏览器中所有其他内容排队相同的方式排队(即,在当前JavaScript块完成执行之前,重新绘制不会发生),但在调试器中暂停通常会允许重新绘制 在您的情况下,您可以使用带有即时超时的
setTimeout
来修复它:
RecordManager.prototype._instantiateNewRecord = function(node) {
this.beginLoad();
setTimeout(function() {
var new_record = new Record(node.data.fields, this);
this.endLoad();
}, 0);
};
这将允许在执行代码的下一部分之前进行重新绘制。JavaScript始终是同步的。当涉及ajax调用和计时器时,它模仿多线程行为,但是当回调返回时,它将像往常一样阻塞
这就是说,您很可能在该构造函数的某个地方有一个
setTimeout
(或者您正在使用的方法有)。即使是setTimeout(fnc,0)
JavaScript始终是同步的。当涉及ajax调用和计时器时,它模仿多线程行为,但是当回调返回时,它将像往常一样阻塞
这就是说,您很可能在该构造函数的某个地方有一个
setTimeout
(或者您正在使用的方法有)。即使是setTimeout(fnc,0)
也确实有奇怪的行为!您从哪里拨打电话?也许,如果它来自阻塞呈现队列的事件处理程序,您可以异步运行它?这的确是一种奇怪的行为!您从哪里拨打电话?也许,如果它来自阻塞呈现队列的事件处理程序,您可以异步运行它?这就是解决方案。事实上,我刚刚找到了另一个问题的答案,这个问题在同一个话题上涉及到了更多的细节。这就是解决办法。事实上,我刚刚找到了另一个问题的答案,这个问题在同一个话题上涉及到了更多的细节。