51

在使用主干几个星期后,我意识到下划线延迟最终解决了我在渲染各种视图时遇到的许多异步问题。有人可以帮我准确理解下划线 defer 的作用以及 $.ready() 或其他类型的等待 dom 呈现函数有何不同。使用它的缺点是什么?

_.defer = function(func) {
    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};
4

1 回答 1

75
# These are equivalent
_.defer(fn);
setTimeout(fn, 1);

所以defer只是一毫秒setTimeout(它还有一些便利功能,但这些在这里并不重要。)


JavaScript 有运行循环。它是单线程的,但它的执行基于事件或计时器开始和停止。每次您的 JS 引擎开始运行一些代码时,它都会开始其运行循环的一次迭代。

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

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

这会提醒“之前”,然后是“之后”。这是因为当前的运行循环结束了哪些警报“之前”,然后紧接着一个新的运行循环开始并运行警报“之后”的代码。

因此,只要您在这里有代码,但您希望它首先运行出现在此代码之后的代码,那么您将使用defer.

_.defer(functionToRunLast);
functionToRunFirst();

这对 DOM 来说很方便。有时您更改它,但更改不会立即解析或呈现。在运行循环结束时,浏览器赶上并解析和渲染 DOM,然后下一个运行循环开始并可以与新渲染的 DOM 交互。

(究竟是什么情况导致了这种延迟的 DOM 解析,我不确定,但我过去在自己的项目中注意到了它。)


不是DOM 就绪的替代品。下一个运行循环可能发生DOM 就绪之前触发,不要混淆这些概念。

于 2013-03-19T00:10:06.690 回答