Next tick override functionality does 函数将被调用
Next tick override functionality does function will be called
我需要覆盖以下代码
此处函数将在下一个tick
执行
req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
setTimeout(fn, 5);
} : function (fn) { fn(); };
有了这个,
window.require.nextTick = function(fn) { fn(); };
由于函数将被立即调用,
在这种情况下它不会在下一次报价时执行吗?
如果你有这样的功能:
window.require.nextTick = function(fn) { fn(); };
每次调用window.require.nextTick()
,fn()
会立即执行。
if I change the code to the second option whethaer It will be problematic
不,不会造成任何问题。第一个和第二个代码之间的唯一区别是第一个 fn()
在 5 毫秒后调用,而第二个立即调用。在这两个示例中,每次调用 window.require.nextTick()
时都会调用 fn()
。
if I change the code to the second option whethaer It will be problematic and if yes why???
我不建议进行该更改,因为一般来说它可能会出现问题。 require.nextTick
的文档(出现在函数定义之前)说:
Execute something after the current tick of the event loop.
同步调用 fn
违反了应该执行的规范 "after the current tick"。 (请在此处查看我的回答的结尾以了解可能的反对意见。)
如果您想知道为什么这可能是一个问题,请考虑 RequireJS 监听 DOM 事件。像 require.nextTick
这样的函数所做的一件事是 给事件处理程序一个机会 运行。如果您将 require.nextTick
设置为同步执行其功能,那么您就没有机会给 运行 事件处理程序。在某些情况下,这可能会导致 RequireJS 停止正常工作。
在这一点上,有人可能会反对nextTick
的定义,让它同步调用fn
是可以的,因为如果setTimeout
没有定义,那么它同步调用 fn
:
req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
setTimeout(fn, 4);
} : function (fn) { fn(); };
我认为这是针对异常情况,而不是通过 HTTP 请求异步加载模块的 run-of-the-mill 情况。在某些情况下,比如可能缺少浏览器或 Node.js 提供的 JS 环境的嵌入式设备,执行使用 RequireJS 的软件的唯一方法是加载经过 r.js
优化的包并在捆绑包中包含 require.js
。 在这种情况下,让nextTick
同步调用fn
是没有实际意义的,因为在RequireJS执行时,所有模块都已经加载了。
原来的功能有根本性的错误。如果 setTimeout
未定义,它的行为 非常 不同。
Javascript 在 event loop 上运行。您的 Javascript 代码一直运行到完成,其他 Javascript 代码将在 "queue" 中等待轮到它。例如,用户事件(如单击按钮)的事件侦听器获取 "queued" 并等待当前代码完成。
您的 nextTick
函数大概是为了向 "queue" 添加一个函数,以便稍后由事件循环执行。这有时很有用。例如,您可以拥有自己的事件发射器并希望对自己的事件进行排队。
如果 setTimeout
未定义,您的 nextTick
函数因此 损坏 。它将执行函数 now 而不是将其添加到 "queue"。这将导致 完全不同的 行为,这意味着只有某些浏览器才会出现错误。
请修改您的代码以改用此代码:
window.require.nextTick = function(fn) { setTimeout(fn, 5) };
并忽略未实现 setTimeout
的浏览器。他们可以有一个大错误而不是奇怪的细微错误。
郑重声明,在过去 20 年左右的时间里,setTimeout
在所有主要浏览器中都有效。支持回IE4!所以这个条件是完全没有必要的。
我需要覆盖以下代码
此处函数将在下一个tick
执行req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
setTimeout(fn, 5);
} : function (fn) { fn(); };
有了这个,
window.require.nextTick = function(fn) { fn(); };
由于函数将被立即调用, 在这种情况下它不会在下一次报价时执行吗?
如果你有这样的功能:
window.require.nextTick = function(fn) { fn(); };
每次调用window.require.nextTick()
,fn()
会立即执行。
if I change the code to the second option whethaer It will be problematic
不,不会造成任何问题。第一个和第二个代码之间的唯一区别是第一个 fn()
在 5 毫秒后调用,而第二个立即调用。在这两个示例中,每次调用 window.require.nextTick()
时都会调用 fn()
。
if I change the code to the second option whethaer It will be problematic and if yes why???
我不建议进行该更改,因为一般来说它可能会出现问题。 require.nextTick
的文档(出现在函数定义之前)说:
Execute something after the current tick of the event loop.
同步调用 fn
违反了应该执行的规范 "after the current tick"。 (请在此处查看我的回答的结尾以了解可能的反对意见。)
如果您想知道为什么这可能是一个问题,请考虑 RequireJS 监听 DOM 事件。像 require.nextTick
这样的函数所做的一件事是 给事件处理程序一个机会 运行。如果您将 require.nextTick
设置为同步执行其功能,那么您就没有机会给 运行 事件处理程序。在某些情况下,这可能会导致 RequireJS 停止正常工作。
在这一点上,有人可能会反对nextTick
的定义,让它同步调用fn
是可以的,因为如果setTimeout
没有定义,那么它同步调用 fn
:
req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
setTimeout(fn, 4);
} : function (fn) { fn(); };
我认为这是针对异常情况,而不是通过 HTTP 请求异步加载模块的 run-of-the-mill 情况。在某些情况下,比如可能缺少浏览器或 Node.js 提供的 JS 环境的嵌入式设备,执行使用 RequireJS 的软件的唯一方法是加载经过 r.js
优化的包并在捆绑包中包含 require.js
。 在这种情况下,让nextTick
同步调用fn
是没有实际意义的,因为在RequireJS执行时,所有模块都已经加载了。
原来的功能有根本性的错误。如果 setTimeout
未定义,它的行为 非常 不同。
Javascript 在 event loop 上运行。您的 Javascript 代码一直运行到完成,其他 Javascript 代码将在 "queue" 中等待轮到它。例如,用户事件(如单击按钮)的事件侦听器获取 "queued" 并等待当前代码完成。
您的 nextTick
函数大概是为了向 "queue" 添加一个函数,以便稍后由事件循环执行。这有时很有用。例如,您可以拥有自己的事件发射器并希望对自己的事件进行排队。
如果 setTimeout
未定义,您的 nextTick
函数因此 损坏 。它将执行函数 now 而不是将其添加到 "queue"。这将导致 完全不同的 行为,这意味着只有某些浏览器才会出现错误。
请修改您的代码以改用此代码:
window.require.nextTick = function(fn) { setTimeout(fn, 5) };
并忽略未实现 setTimeout
的浏览器。他们可以有一个大错误而不是奇怪的细微错误。
郑重声明,在过去 20 年左右的时间里,setTimeout
在所有主要浏览器中都有效。支持回IE4!所以这个条件是完全没有必要的。