为什么下划线延迟修复了我的许多问题?
在使用骨干几个星期后,我意识到,下划线延迟最终修复了我在渲染各种视图时遇到的许多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准备好之前发生,不要混淆这些概念。