我需要覆盖以下代码
此处函数将在下一个刻度
中执行req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {
setTimeout(fn, 5);
} : function (fn) { fn(); };
有了这个,
window.require.nextTick = function(fn) { fn(); };
由于该函数将立即被调用, 在这种情况下,它不会在下一个刻度执行吗?
答案 0 :(得分:2)
如果我将代码更改为第二个选项,那么这将是有问题的,如果是,为什么???
我不建议进行更改,因为一般来说它可能会有问题。 require.nextTick
的文档(出现在函数定义之前)说:
在事件循环的当前标记之后执行某些操作。
同步调用fn
违反了“当前勾选后”执行应该发生的规范。 (请参阅我的答案的结尾处,以了解可能存在的异议。)
如果你想知道为什么它可能是一个问题,请考虑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请求加载模块的普通情况。在某些情况下,比如缺少浏览器或Node.js提供的JS环境的嵌入式设备,执行使用RequireJS的软件的唯一方法是加载经过r.js
并包含的优化包。捆绑中的require.js
。 在这种情况下,nextTick
同步调用fn
将没有实际意义,因为在RequireJS执行时,所有模块都已加载。
答案 1 :(得分:1)
如果你有这样的功能:
window.require.nextTick = function(fn) { fn(); };
每次您致电window.require.nextTick()
,fn()
将立即执行。
如果我将代码更改为第二个选项,则会出现问题
不,它不会造成任何问题。第一个和第二个代码之间的唯一区别是,第一个fn()
在5毫秒后调用,第二个代码立即调用。在这两个示例中,每次调用fn()
时都会调用window.require.nextTick()
。
答案 2 :(得分:1)
原始功能存在根本性的问题。如果setTimeout
未定义,则行为非常。
Javascript在event loop上运行。您的Javascript代码一直运行,直到完成,其他Javascript代码将在"队列"中等待。例如,用户事件的事件监听器(如单击按钮)会排队等待"并等待当前代码完成。
您的nextTick
函数可能意味着将一个函数添加到"队列"所以它将在稍后由事件循环执行。这有时很有用。例如,您可以拥有自己的事件发射器,并希望将自己的事件排队。
如果nextTick
未定义,则setTimeout
功能已损坏。它将执行 now 功能,而不是将其添加到"队列"。这将导致完全不同的行为,这意味着只有某些浏览器才会出现错误。
请修改您的代码以使用此代码:
window.require.nextTick = function(fn) { setTimeout(fn, 5) };
并忽略不实施setTimeout
的浏览器。他们可能会有一个很大的错误而不是奇怪的微小错误。
仅仅为了记录,setTimeout
在过去20年左右的时间里适用于所有主流浏览器。它被支持回到IE4!所以这个条件是完全没必要的。