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

时间:2013-03-18 23:57:20

标签: javascript backbone.js underscore.js

使用主干几周后,我意识到下划线延迟最终修复了我遇到的关于渲染各种视图的许多异步问题。 有人可以请帮助我准确理解下划线延迟的作用以及$ .ready()或其他类型的等待dom来呈现函数的方式有何不同。使用它有什么不利之处?

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

1 个答案:

答案 0 :(得分:74)

# 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解析,我不确定,但我在过去的项目中已经注意到了。)


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