Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么不是';这段代码不是同步执行的吗?_Javascript_Jquery_Dom_Asynchronous_Sync - Fatal编程技术网

Javascript 为什么不是';这段代码不是同步执行的吗?

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() {

我的印象是所有DOM操作都是同步的

然而,这段代码并没有像我期望的那样运行

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)

也确实有奇怪的行为!您从哪里拨打电话?也许,如果它来自阻塞呈现队列的事件处理程序,您可以异步运行它?这的确是一种奇怪的行为!您从哪里拨打电话?也许,如果它来自阻塞呈现队列的事件处理程序,您可以异步运行它?这就是解决方案。事实上,我刚刚找到了另一个问题的答案,这个问题在同一个话题上涉及到了更多的细节。这就是解决办法。事实上,我刚刚找到了另一个问题的答案,这个问题在同一个话题上涉及到了更多的细节。