javascript - 为什么下划线延迟解决了我的这么多问题?

标签 javascript backbone.js underscore.js

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

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

最佳答案

# 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 就绪触发之前,不要混淆这些概念。

关于javascript - 为什么下划线延迟解决了我的这么多问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15489163/

相关文章:

javascript - 在 Backbone.js 中,在集合下的模型 'create' 之后,如何更新该模型?

javascript - 当跟进请求的答案是 204 时,为什么 OPTIONS 请求会失败?

javascript - 使用下划线 _.extend 扩展 "new"实例是否合法

javascript - 仅将唯一对象添加到 JavaScript 中的数组

javascript - 使用额外的括号调用对象方法

javascript - JSON 到 Backbone.js 模型

javascript - 使 JQuery 函数成为 Plain JS

Javascript Object.Create() 方法

javascript - Backbone.js 路由可选参数

javascript - Lodash _.remove() 和 _.pullAt() 之间的区别