为什么下划线延迟修复了我的许多问题?

在使用骨干几个星期后,我意识到,下划线延迟最终修复了我在渲染各种视图时遇到的许多asynchronous问题。 有人可以帮我理解什么是下划线延迟,以及$ .ready()或其他types的等待dom渲染函数的方式。 使用它的缺点是什么?

_.defer = function(func) { return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); }; 
 # These are equivalent _.defer(fn); setTimeout(fn, 1); 

所以defer只是一个毫秒setTimeout(它有更多的便利function,但这些在这里并不重要。)


JavaScript已经运行循环。 它是单线程的,但是它的执行是基于事件或定时器开始和停止的。 每当你的JS引擎开始运行一些代码,它就开始一个迭代的运行循环。

所以defer是说“在下一次运行循环中运行这个代码”。

 _.defer(function() { alert('after'); }); alert('before'); 

这提醒“之前”,然后“之后”。 这是因为当前的运行循环结束了“before”之前的哪个警报,然后就开始了一个新的运行循环,并在“after”之后运行代码。

所以,无论何时你在这里都有代码,但是你希望它运行在这个代码之后出现的代码,那么你会使用defer

 _.defer(functionToRunLast); functionToRunFirst(); 

这可以方便的DOM。 有时你会改变它,但这些改变不会立即parsing或渲染。 在运行循环结束时,浏览器捕获并parsing并呈现DOM,然后下一个运行循环开始,并且可以与新呈现的DOM进行交互。

(究竟是什么情况导致了这个延迟的DOMparsing,我不确定,但我已经注意到它在我自己的项目中。


不是 DOM的替代品。 下一次运行循环可能会 DOM准备好之前发生,不要混淆这些概念。