ces*_*ara 48 javascript backbone.js underscore.js
在使用主干几周后,我意识到下划线延迟最终修复了我遇到的关于渲染各种视图的许多异步问题.有人可以请帮助我准确理解下划线延迟的作用以及$ .ready()或其他类型的等待dom来呈现函数的方式有何不同.使用它有什么不利之处?
_.defer = function(func) {
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};
Run Code Online (Sandbox Code Playgroud)
Ale*_*yne 74
# These are equivalent
_.defer(fn);
setTimeout(fn, 1);
Run Code Online (Sandbox Code Playgroud)
所以defer只需一毫秒setTimeout.(它有一些更方便的功能,但这些并不重要.)
JavaScript已经运行循环.它是单线程的,但它的执行基于事件或定时器开始和停止.每次你的JS引擎启动运行一些代码时,它都会开始运行循环的一次迭代.
那么defer说什么是"在下一个运行循环中运行此代码".
_.defer(function() { alert('after'); });
alert('before');
Run Code Online (Sandbox Code Playgroud)
这会在"之前"和"之后"发出警报.这是因为当前运行循环结束了"之前"警报,然后在新运行循环开始之后立即运行代码警报"之后".
因此,只要您在此处拥有代码,但是您希望它运行首先在此代码之后出现的代码,那么您将使用defer.
_.defer(functionToRunLast);
functionToRunFirst();
Run Code Online (Sandbox Code Playgroud)
这对DOM来说很方便.有时您更改它,但更改不会立即解析或呈现.在运行循环结束时,浏览器赶上并解析并呈现DOM,然后下一个运行循环开始并可以与新呈现的DOM交互.
(究竟是什么情况导致这个延迟的DOM解析,我不确定,但我在过去的自己的项目中已经注意到了.)
它不是 DOM准备就绪的替代品.下一个运行循环可能在 DOM就绪之前发生,不要混淆这些概念.
| 归档时间: |
|
| 查看次数: |
16898 次 |
| 最近记录: |