下一个tick tick功能将调用函数

sho*_*a T 5 javascript event-loop node.js requirejs

我需要覆盖以下代码

这里的函数将在下一个tick中执行

req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
    setTimeout(fn, 5);
} : function (fn) { fn(); }; 
Run Code Online (Sandbox Code Playgroud)

有了这个,

window.require.nextTick = function(fn) { fn(); };
Run Code Online (Sandbox Code Playgroud)

由于该函数将立即被调用,在这种情况下它是否会在下一次打勾时执行?

Lou*_*uis 2

如果我将代码更改为第二个选项,是否会出现问题,如果是,为什么???

我不建议进行这种更改,因为一般来说这可能会出现问题。的文档require.nextTick(出现在函数定义之前)说:

在事件循环的当前标记之后执行某些操作。

同步调用fn违反了执行应在“当前报价之后”发生的规范。(请参阅我的答案末尾以了解可能的反对意见。)

如果您想知道为什么这可能是一个问题,请考虑 RequireJS 监听 DOM 事件。拥有类似函数的一件事require.nextTick为事件处理程序提供运行的机会。如果您设置require.nextTick同步执行其函数,那么您就没有机会运行事件处理程序。在某些情况下,这可能会导致 RequireJS 停止正常工作。

此时,有人可能会反对 is 的定义,nextTick让它fn同步调用是可以的,因为如果setTimeout没有定义,那么它确实会fn同步调用:

req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
    setTimeout(fn, 4);
} : function (fn) { fn(); };
Run Code Online (Sandbox Code Playgroud)

我认为这适用于异常情况,而不是通过 HTTP 请求异步加载模块的普通情况。在某些情况下,例如缺少浏览器或 Node.js 提供的 JS 环境的嵌入式设备,执行使用 RequireJS 的软件的唯一方法是加载已通过r.js并包含require.js在捆绑包中的优化捆绑包。在这种情况下,同步nextTick调用fn是没有意义的,因为当 RequireJS 执行时,所有模块都已经加载。